2011-09-09 105 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