与SQL中的NULL进行比较

Nul*_*ion 6 sql null ansi-sql

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 NULLIS 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)

呸.

  • 言外之意是,没有标准的方法来禁用标准行为。 (2认同)
  • 如果您使用Bill的解决方案,您将以标准方式获得所需的行为.如果您找到特定于供应商的方法来禁用标准行为并执行此操作,则会获得双重不可移植的代码:一次是依赖于供应商扩展,另一种是在所有语句中使用错误的比较.强烈不推荐. (2认同)

Dou*_*rie 4

以下是 SQLite、PostgreSQL、Oracle、Informix、DB2、MS-SQL、OCELOT、MySQL 3.23.41、MySQL 4.0.16、Firebird、SQL Anywhere 和 Borland Interbase 中空处理的精彩比较