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 为真。整形后检查分组,再核对预期记录,整形不验证语义。

参考资料

使用工具

指南 →