2011-08-18 55 views
1

我確定SQL中有一個類似「DifferentThan」的方法。
我不是在尋找<>運營商,這將失敗NULL比較。是否有SQL值「DifferentThan」比較方法

例如,想象一個可爲空的位列。

當「不是真正的」我可以做這樣的事情

WHERE COALESCE(myBit,0) = 0 

和檢查也許這是最好的方法......我真的不感興趣。我特別試圖回憶爲類似「DIFFERENTTHAN」

WHERE myBit DIFFERENTTHAN 1 

編輯語法:我下面回答我自己的問題。

+0

你使用什麼SQL方言?唯一解決我所見過的問題的方法是COALESCE技巧,正如你所說,這是你想要避免的。 –

+0

@Joel Brown這不是我想要*避免* COALESCE',而是更想記住我以前見過的這種特殊語法。 – Matthew

+0

FWIW,我從來沒有聽說過這樣的關鍵字。 –

回答

0

你可以試試這個

WHERE NOT myBit = 1 

這是不是一個單一的運營商,但比使用COALESCE清潔了一下。

+0

這也行不通。它與'<>'相同的方式失敗了'NULL'比較。要測試:'SELECT'測試'WHERE NOT 1 = NULL' – Matthew

+0

NULL = 1的計算結果爲false,這會導致我們NOT FALSE,這是TRUE。因此,對於除1以外的任何值,它都會返回TRUE。 – Kibbee

+1

我相信三值邏輯,NULL = 1的計算結果爲NULL。 –

1

對於標準 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空值行爲下運行,您的標準編碼都會得到相同的結果。

+0

你的答案似乎與我的答案中發佈的鏈接中的Itzik Ben-Gan構成的解決方案形成對比。 – Matthew

+0

因爲我從來沒有見過在執行IS DISTINCT FROM在野外— SQL Server,DB2和Oracle都不支持它—我必須將特定的SQL99語言特性歸檔爲「很高興有」。由於我不能編寫利用假想語言功能的代碼,就像大多數人一樣,我堅持使用具有IS [NOT] NULL的複合條件來實現我想要的行爲。 –

相關問題