ANSI-92 SQL要求与NULL
的比较评估为“falsy”,例如:
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
一团糟。
答案 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中空处理的比较好的比较