對於標準 ANSI/ISO SQL,空行爲是相當嚴格定義。簡而言之:
涉及NULL
值所有表達式求值NULL
,除了coalesce()
。
涉及NULL
值的所有測試均失敗,但明確測試無效。以下失敗:
X = null
null = null
X < null
- 等
實質上,NULL
是位於可變的結構域之外的值。這意味着逆比較運算符不對稱WRT到NULL
。
下面的所有表達式,如果涉及null,失敗並且空值落空。
* `X < null`
* `X >= null`
* `X > null`
* `not (X > null)`
* etc.
In standard SQL, test for `null`/`not null`, one **must** use `IS [NOT] NULL`.
在你的情況下,有一個測試成功,如果一個值爲null,你可以做這樣的事情:
where (A = B or B is null)
。 這將會失敗A是空的,B是非空的,或者A和B非空並且比較不等於。如果A和B非空且比較相等,或者B爲空,則它成功。
where A = coalesce(B,A)
。這與上述表達式的行爲相同。我傾向於更喜歡它,因爲語法更簡潔。
注意某些SQL實現允許從標準(MS /的Sybase的Transact-SQL例如不同空行爲,必須允許與標準比較運營商無效檢測,並允許空char
/varchar
至選項在SQL Server的早期版本中,無效是通過將列的可變長度來實現的,無論其類型如何,空值的存儲長度爲零,對於char
/varchar
字段,無(空)字符串被存儲爲單個空間,不完全直觀,作爲副作用,像foo char(8) null
這樣的聲明相當於聲明它爲foo varchar(8) null
。
即使您的SQL實現支持非標準的空行爲,您應該避免它,並且將其編碼爲具有ANSI空行爲的標準SQL。在大多數支持非標準空行爲的實現中,該行爲可通過運行時選項進行配置。無論您是否在標準ANSI空值行爲下運行,您的標準編碼都會得到相同的結果。
你使用什麼SQL方言?唯一解決我所見過的問題的方法是COALESCE技巧,正如你所說,這是你想要避免的。 –
@Joel Brown這不是我想要*避免* COALESCE',而是更想記住我以前見過的這種特殊語法。 – Matthew
FWIW,我從來沒有聽說過這樣的關鍵字。 –