2013-04-26 220 views
17

我只是好奇。我知道NULL安全等運營商< =>,但有一些空安全不等於運營商,或我必須一直使用類似的東西:MySQL - NULL安全不等於運算符

(tab.id != 1 OR tab.id IS NULL) 

還是有人喜歡

!(tab.id <=> 1) 

回答

7
COALESCE(tab.id, 0) != 1 

可以在這裏使用,如果你喜歡它。我瀏覽參數,並返回不是NULL的第一個值。在這種情況下,如果它是NULL,它會比較0 != 1。雖然它可能會使用更多的符號,但它仍然更易於管理,而不是被迫在這些情況下總是將「布爾」作爲解決方案。

COALESCE()

+0

我認爲這是首選的方法,因爲這個查詢也可以在SQL Server上運行。最好的方法是不要有空值並且有適當的默認值,但源數據不能總是由開發人員來控制。 – 2015-01-25 18:08:27

+3

不幸的是,如果你不知道這個比較的RHS的價值,你不知道什麼要COALESCE()你的NULL! – Arth 2016-02-04 14:42:30

+0

如果你想比較tab.id和值,但它不起作用,如果你想比較tab.id和tab_childs.tab_id這兩個字段。 – 2017-12-18 14:44:38

8

閱讀文檔我發現,NOT(NULL < => 1)的作品,我想這也是符合ISO標準,但是很麻煩。使用列名會是這樣一個更好的方式來顯示:NOT(tbl.col1 < => 1)

+2

'<=>'不是標準的SQL,它是MySQL的擴展。對於SQL來說,標準等效的無效安全比較是非常冗長的:'IS [NOT] DISTINCT FROM'。 – 2013-11-04 22:27:16

0

如果您知道比較IS NOT NULL的RHS:

COALESCE(tab.id != 1, 1) 

或者

COALESCE(tab.id != 1, TRUE) 

會給你正確的結果。

這是否是更好更具可讀性比:

(tab.id != 1 OR tab.id IS NULL) 

是值得商榷..

我也被引誘與比較第一濾除NULL邏輯,所以我不必想想他們!我可能會寫你的第一個等式爲:

(tab.id IS NULL OR tab.id != 1) 

性能將取決於NULL小號患病但是。

1

現在MySQL沒有NULL-safe不等於運算符。

使用的MySQL最普遍的解決方案是:

!(tab.id <=> 1) 

NOT tab.id <=> 1 

,因爲它會正常工作,如果連到位1您將使用NULL