问题描述
有桌子
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 from
是null
安全的比较运算符,出于比较目的,它们将null
视为“真实”值(例如null = null
)