使用单个占位符在 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 from
是 null
安全比较运算符,将 null
视为“真实”值以进行比较(因此 null = null
实例)。
PostgreSQL 中参数的占位符是 </code>、<code>
等。让您使用 ?
代替是一些驱动程序为了方便而实现的,但它们确实提供了较少的灵活性。
使用真正的表示法,您可以指定一个参数出现在多个地方:
SELECT x FROM t WHERE x = OR x IS NULL AND IS NULL
这比 IS NOT DISTINCT FROM 的优势在于它可以使用索引。
有一个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 from
是 null
安全比较运算符,将 null
视为“真实”值以进行比较(因此 null = null
实例)。
PostgreSQL 中参数的占位符是 </code>、<code>
等。让您使用 ?
代替是一些驱动程序为了方便而实现的,但它们确实提供了较少的灵活性。
使用真正的表示法,您可以指定一个参数出现在多个地方:
SELECT x FROM t WHERE x = OR x IS NULL AND IS NULL
这比 IS NOT DISTINCT FROM 的优势在于它可以使用索引。