在 Postgres 中,字段 != 'N' 无法包含 NULL 值
In Postgres, field != 'N' fails to include NULL value
我们在 Postgres 中有一个案例
where p.is_ready_for_submission != 'N'
未能将 NULL 作为满足此条件的值。 is_ready_for_submission
列可以是 NULL
、Y
、N
。上面语句的目的是包含NULL
和Y
。但是 NULL 不包括在内(它们在 Oracle 中)。
实现此目的的唯一方法是重写为
(p.is_ready_for_submission is null or p.is_ready_for_submission = 'Y')
这对 Postgres 来说有什么特别之处吗?注意:!=
和 <>
.
都会发生这种情况
它是通用的,也是 SQL 的基本前提:对 null
的任何计算都会导致 null
,而不是 true
。
但是有一个通用的简化方法:
where coalesce(p.is_ready_for_submission, 'N') != 'Y')
或者可能表达得更清楚:
where coalesce(p.is_ready_for_submission, 'Y') == 'Y')
coalesce()
函数,它是 SQL 标准的一部分,returns 第一个 non-null 参数。
某些数据库有特定的支持:
MySQL
MySQL 具有“空安全”相等运算符 <=>
:
where not p.is_ready_for_submission <=> 'N'
Postgres
Postgres 具有“空安全”is distinct from
语法:
where p.is_ready_for_submission is distinct from 'N'
不,这不是 Postgres 特有的,在 Oracle 中也是如此 (online example a, online example b)。操作数之一为 NULL
的 !=
或 <>
表达式的计算结果为 NULL
,这在 WHERE
子句中将被视为假值。
要在结果中包含 NULL
值,您可以使用 SQL-1999 标准
p.is_ready_for_submission IS DISTINCT FROM 'n'
其中 will not propagate NULL
values 但将它们视为不同的值。
不幸的是,it's not supported in Oracle, various alternatives 存在(就像你问题中的那个)。
我们在 Postgres 中有一个案例
where p.is_ready_for_submission != 'N'
未能将 NULL 作为满足此条件的值。 is_ready_for_submission
列可以是 NULL
、Y
、N
。上面语句的目的是包含NULL
和Y
。但是 NULL 不包括在内(它们在 Oracle 中)。
实现此目的的唯一方法是重写为
(p.is_ready_for_submission is null or p.is_ready_for_submission = 'Y')
这对 Postgres 来说有什么特别之处吗?注意:!=
和 <>
.
它是通用的,也是 SQL 的基本前提:对 null
的任何计算都会导致 null
,而不是 true
。
但是有一个通用的简化方法:
where coalesce(p.is_ready_for_submission, 'N') != 'Y')
或者可能表达得更清楚:
where coalesce(p.is_ready_for_submission, 'Y') == 'Y')
coalesce()
函数,它是 SQL 标准的一部分,returns 第一个 non-null 参数。
某些数据库有特定的支持:
MySQL
MySQL 具有“空安全”相等运算符 <=>
:
where not p.is_ready_for_submission <=> 'N'
Postgres
Postgres 具有“空安全”is distinct from
语法:
where p.is_ready_for_submission is distinct from 'N'
不,这不是 Postgres 特有的,在 Oracle 中也是如此 (online example a, online example b)。操作数之一为 NULL
的 !=
或 <>
表达式的计算结果为 NULL
,这在 WHERE
子句中将被视为假值。
要在结果中包含 NULL
值,您可以使用 SQL-1999 标准
p.is_ready_for_submission IS DISTINCT FROM 'n'
其中 will not propagate NULL
values 但将它们视为不同的值。
不幸的是,it's not supported in Oracle, various alternatives 存在(就像你问题中的那个)。