2011-09-09 63 views
6

ANSI-92 SQL任务的空值与NULL比较评价为“falsy”,例如:因为NULL不能像比拟比较与SQL

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

威尔不返回行。相反,谓语IS NULLIS NOT NULL必须改用:

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

研究表明我甲骨文和PostgreSQL,MySQL和SQLite的所有支持ANSI语法。添加到列表DB2和Firebird。

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

尽管整个空字符串= NULL乱七八糟。

+0

Oracle(这里是11g)完全按照你在这两种情况下的描述。 –

回答

3

Here是在SQLite的和PostgreSQL,甲骨文,Informix中,DB2空处理一个很好的比较,MS-SQL,豹猫,MySQL的41年3月23日,MySQL的4.0.16,火鸟,SQL Anywhere中,和Borland Interbase的

14

对于什么是值得的,将某些东西与NULL进行比较并非严格错误,它是未知。此外,NOT未知仍然未知。

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

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

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

甲骨文是最难走的路。你必须创造性地使用NVL()或布尔表达式:

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

Yuck。

+0

这不是我的问题,但很高兴知道。 +1 – NullUserException

+1

行之间的写法是,没有标准的方法来禁用标准行为。 –

+0

@丹尼尔我根本没有在寻找一种标准的方式;只是*任何*方式(如SQL Server的'SET ANSI_NULLS OFF') – NullUserException