使用单个占位符在 Postgresql 中进行空搜索

Null-including search in Postgresql using single placeholder

有一个table

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 解析那些占位符,它 returns 42。如果我用 null 解决它们 returns null。换句话说,它是一个包含空的搜索。

问题是:

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

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

所以:

SELECT x FROM t WHERE x IS NOT DISTINCT FROM ?

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

where x is not distinct from ?

is distinct from/is not distinct fromnull 安全比较运算符,将 null 视为“真实”值以进行比较(因此 null = null实例)。

PostgreSQL 中参数的占位符是 </code>、<code> 等。让您使用 ? 代替是一些驱动程序为了方便而实现的,但它们确实提供了较少的灵活性。

使用真正的表示法,您可以指定一个参数出现在多个地方:

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

这比 IS NOT DISTINCT FROM 的优势在于它可以使用索引。