2024年8月19日 星期一

[SQL Server]有關NULL觀念

        之前同事寫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寫到後面邏輯凌亂不堪。



沒有留言:

張貼留言