之前同事寫SQL遇到的問題,不知為什麼一直沒正確撈到資料。
後面請我協助查看時,一時也搞不清楚原因,等看到資料面才發現到是對NULL相關判斷沒寫好的問題。
趁這個機會來寫篇文章來釐清一些觀念細節。
簡單來說就是一般狀況無法使用 =、< > 等比較運算子來篩選NULL值。
請參照範例圖:
比較運算子會回傳類型為Boolean的結果,此結果有三種值分別是TRUE、FALSE、UNKNOWN。
當預設SET ANSI_NULLS ON 的時候,對MSSQL來說 NULL是無法比較的,所以會回傳UNKNOWN。
但如果將SET ANSI_NULLS OFF時,NULL將會是已知值,且同等其他NULL,此時Boolean將不會回傳UNKNOWN(反之只會回傳TRUE、FALSE)。
範例如圖:
所以當預設SET ANSI_NULLS ON,在If、Where、Join等用到比較運算子時,
篩選會把資料有NULL的全部排除掉(不管是=或< >等)。
但這邊建議還是盡量不要去修改SET ANSI_NULLS ON/OFF 設定,
多使用IS NULL、ISNULL()等其他語法來處理判斷NULL值,
以免SQL寫到後面邏輯凌亂不堪。
沒有留言:
張貼留言