ANSI-92 SQL要求将NULL评估与"falsy"进行比较,例如:
SELECT * FROM table WHERE field = NULL
SELECT * FROM table WHERE field != NULL
Run Code Online (Sandbox Code Playgroud)
两者都不会返回任何行,因为NULL无法像那样进行比较.相反,谓语IS NULL和IS NOT NULL必须改用:
SELECT * FROM table WHERE field IS NULL
SELECT * FROM table WHERE field IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
研究表明,Oracle 1,PostgreSQL,MySQL和SQLite都支持ANSI语法.添加到该列表DB2和Firebird.
除了ANSI_NULLS关闭SQL Server之外,还有哪些其他RDBMS支持非ANSI语法?
1整个空字符串= NULL尽管很糟糕.
Bil*_*win 15
对于它的价值,将某些东西与NULL进行比较并不是严格错误的,它是未知的.此外,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有一个类似的null安全比较运算符<=>,如果操作数相同则返回true,如果它们不同则返回false.
Oracle有最艰难的道路.你必须使用NVL()或布尔表达式来创造性:
WHERE a = b OR (a IS NULL AND b IS NULL)
Run Code Online (Sandbox Code Playgroud)
呸.