2009-11-19 25 views
10

我發現SQL的這個片段在視圖中,我頗爲不解通過它的目的(實際的SQL縮短爲簡潔起見):COALESCE用NULL

SELECT 
    COALESCE(b.Foo, NULL) AS Foo 

FROM a 
LEFT JOIN b ON b.aId=a.Id 

我想不出的合併的目的,理由只有一個與空,而不是僅僅這樣做:

SELECT 
    b.Foo AS Foo 

FROM a 
LEFT JOIN b ON b.aId=a.Id 

或者至少是不包括明確的NULL:

SELECT 
    COALESCE(b.Foo) AS Foo 

FROM a 
LEFT JOIN b ON b.aId=a.Id 

我不知道是誰創作了這個(所以我不能問),創作時,還是寫了什麼特定的MS SQL Server版本(當然,在2008年之前)。

是否有任何有效的理由與NULL合併,而不是直接選擇列?我忍不住笑,把它當作菜鳥的錯誤寫下來,但這讓我懷疑是否有一些我不知道的「邊緣情況」。

+2

看起來像一個新人的錯誤給我。 – 2009-11-19 22:15:57

+4

或者需求已經多次改變,所以這個查詢被不同的開發者多次修改。也許COALESCE(b.Foo,NULL)是COALESCE(b.Foo,[某值/表達式])之前。然後要求變了。所以有人沒有想到就變成了COALESCE(b.Foo,NULL)。 – David 2009-11-19 22:19:41

+0

如果b.Foo爲NULL,這可能是觸發錯誤的方法。是否有效是另一個問題。 – Mike 2016-09-02 19:33:17

回答

11

你是對的 - 沒有任何理由使用:

SELECT COALESCE(b.Foo, NULL) 

...因爲如果b.foo爲NULL,你可能也只是使用:

SELECT b.foo 

...假設你想要知道值是否爲空。

4

我認爲那裏可能是一個邊緣情況,但它是非常具有歷史意義的 - 這是一個猜測,但它可以包圍b.foo =''例如一串空格。在SQL和LTrim('')返回空(6/6.5)回到足夠遠,所以我想知道空字符串上的Coalesce是否也評估它爲null,如果它確實然後機制被用於只能將空格字符串轉換爲空值? (如果所有值均爲空值,Coalesce將返回空值。)

這是一個猜測,我不能馬上測試,但不應該很難檢查。