使用单个占位符在Postgresql中包含null的搜索

问题描述

有桌子

CREATE TABLE t (x int)
INSERT INTO t VALUES (null),(0),(42)

并使用两个占位符进行查询

SELECT x FROM t WHERE x = ? OR x IS NULL AND ? IS NULL

逻辑如下:如果我用42解析那些占位符,它将返回42。如果我用null解析它们,则返回null。换句话说,它是一个包含空值的搜索

问题是:

是否可以重写此查询(在Postgresql中)以使单个占位符?而不是两个?

解决方法

Postgres通过operator IS [NOT] DISTINCT FROM实现null安全相等,这正是您所要求的。

所以:

SELECT x FROM t WHERE x IS NOT DISTINCT FROM ?
,

PostgreSQL中参数的占位符为$1$2等。为了方便起见,一些驱动程序实现了让您使用?的功能,但它们的灵活性却降低了。

使用实数表示法,您可以指定一个参数在多个位置出现:

SELECT x FROM t WHERE x = $1 OR x IS NULL AND $1 IS NULL

与IS NOT DISTINCT FROM相比,它具有优势,因为它可以使用索引。

,

是的。您可以使用is not distinct from并且只能使用一个占位符:

where x is not distinct from ?

is distinct from / is not distinct fromnull安全的比较运算符,出于比较目的,它们将null视为“真实”值(例如null = null