SheepDev

SQL與測試資料

IN 中有 NULL,為何找不到缺少值?

使用工具

想找 open 與未登記狀態的列,IN ('open', NULL) 卻漏掉後者。NULL 不是普通相等值。用 IN 產生工具把成員比對與缺少值條件分開,表達實際意圖。

區分三種看似空的值

SQL 中不同意義
'NULL'  -- text consisting of four letters
''      -- empty string
NULL    -- SQL null

'NULL' 是四個字母,'' 是空字串,NULL 是缺少值。匯入規則決定空儲存格存成什麼,應先查型別與匯入行為,否則可能漏選或誤選。

工具會移除空輸入列,不會由空列產生空字串條件。值無需自行加 SQL 引號;若要找空字串,應在使用處另設計條件。

把 NULL 分開產生 IS NULL

每列一個輸入值
open
NULL
PostgreSQL 風格輸出
("state" IN ('open') OR "state" IS NULL)

選字串、欄 state、PostgreSQL、NULL 獨立條件。open 進 IN,NULL 變 IS NULL;需欄名確定檢查對象。只輸入 NULL 時不產生空 IN,保留分組括號。

字串策略搜尋文字 'NULL',正確與否取決於資料。拒絕策略可暫停模糊匯入供檢查;明確意義比消除錯誤更重要。

未知不同於不符合

一般比較含 NULL 時可能是未知而非真或假。WHERE 只保留真,不保留未知。列入 NULL 不使其彼此相等;要找缺少值請用 IS NULL。

改成 NOT IN 時更要留意

NOT IN 也不能簡單補救:清單有 NULL 時,未符合值也可能不回傳真。未知反轉不是真,勿盲目把輸出 IN 換成 NOT IN。

先說明要未符合一般值、也含缺少值,還是排除缺少值,再在隔離表驗證符合、不符合與 NULL。SheepDev 只產生文字,不連接 DB。

合併其他條件時檢查括號

把狀態選項當成一組
active = TRUE AND ("state" IN ('open') OR "state" IS NULL)

去括號可能改變 OR 與 AND 的結合。此例 open 與 NULL 都要求 active 為真。排版後檢查分組,再核對預期紀錄,排版不驗證語意。

參考資料

使用工具

指南 →