在 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 列可以是 NULLYN。上面语句的目的是包含NULLY。但是 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'

live demo

Postgres

Postgres 具有“空安全”is distinct from 语法:

where p.is_ready_for_submission is distinct from 'N'

live demo

不,这不是 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 存在(就像你问题中的那个)。