与SQL中的NULL进行比较

时间:2011-09-09 20:53:18

标签: sql null ansi-sql

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

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

这两个都不会返回任何行,因为NULL无法像这样进行比较。相反,必须使用谓词IS NULLIS 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一团糟。

2 个答案:

答案 0 :(得分:15)

对于它的价值,将某些内容与NULL进行比较并非严格错误,它是 unknown 。此外,NOT未知仍然未知。

ANSI SQL-99定义谓词IS [NOT] DISTINCT FROM。这允许您在comarisons中混合空值和非空值,并始终获得true或false。以这种方式与null相比为null是正确的,否则与null相比,任何非null都是false。所以否定就像你预期的那样有效。

PostgreSQL,IBM DB2和Firebird支持IS [NOT] DISTINCT FROM

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

Oracle拥有最艰难的道路。您必须使用NVL()或布尔表达式来创作:

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

呸。

答案 1 :(得分:3)

Here是SQLite,PostgreSQL,Oracle,Informix,DB2,MS-SQL,OCELOT,MySQL 3.23.41,MySQL 4.0.16,Firebird,SQL Anywhere和Borland Interbase中空处理的比较好的比较