7

ANSI-92 SQL 要求与NULL评估的比较为“假”,例如:

SELECT * FROM table WHERE field = NULL
SELECT * FROM table WHERE field != NULL

两者都不会返回任何行,因为NULL不能像那样进行比较。相反,必须使用谓词IS NULL和:IS NOT NULL

SELECT * FROM table WHERE field IS NULL
SELECT * FROM table WHERE field IS NOT NULL

研究表明,Oracle 1、PostgreSQL、MySQL 和 SQLite 都支持 ANSI 语法。将 DB2 和 Firebird 添加到该列表中。

除了ANSI_NULLS关闭的 SQL Server,还有哪些其他 RDBMS 支持非 ANSI 语法?

1尽管整个空字符串 =NULL混乱。

4

2 回答 2

15

对于它的价值,将某些东西与 NULL 进行比较并不是严格意义上的错误,它是未知的。此外,NOT未知还是未知。

ANSI SQL-99 定义了一个谓词IS [NOT] DISTINCT FROM。这允许您在comarisons 中混合空值和非空值,并始终得到真或假。null 以这种方式与 null 比较为真,否则任何非 null 与 null 比较为假。所以否定就像你所期望的那样工作。

PostgreSQL、IBM DB2 和 Firebird 确​​实支持IS [NOT] DISTINCT FROM.

MySQL 有一个类似的 null 安全比较运算符<=>,如果操作数相同则返回 true,如果它们不同则返回 false。

甲骨文有最艰难的道路。您必须通过使用NVL()或布尔表达式来发挥创意:

WHERE a = b OR (a IS NULL AND b IS NULL)

呸。

于 2011-09-09T21:09:05.477 回答
3

是 SQLite、PostgreSQL、Oracle、Informix、DB2、MS-SQL、OCELOT、MySQL 3.23.41、MySQL 4.0.16、Firebird、SQL Anywhere 和 Borland Interbase 中的空值处理的一个很好的比较

于 2011-09-09T21:10:21.173 回答