SQL报表返回空值问题:Cust.Ref查询条件如何兼顾多场景筛选
解决方案
问题根因
SQL采用三值逻辑判断规则,NULL 参与 LIKE 比较时返回的结果既不是 TRUE 也不是 FALSE,而是 UNKNOWN,WHERE 子句仅会保留判断结果为 TRUE 的行:
- 初始写法
WHERE Cust.Ref LIKE ?下,当你不需要筛选客户参考号、给占位符传通配符%时,所有Cust.Ref IS NULL的行都会被过滤,导致Nominal Codes模块筛选结果缺失。 - 优化后的写法
WHERE (Cust.Ref LIKE ? OR Cust.Ref IS NULL)强制包含了所有NULL值行,无论你传入的筛选参数是什么,都会带出NULL值记录,不符合按客户参考号精确筛选的需求。
可选修复方案
方案1:参数判断法(兼容性最佳,适配所有SQL方言)
通过判断传入的占位符是否为全通配符 %(即不筛选客户参考号的场景),决定是否包含NULL值行:
WHERE Cust.Ref LIKE ? OR (? = '%' AND Cust.Ref IS NULL)
注意:该写法需要给两个
?占位符传入完全相同的参数值。
效果验证
- 不筛选客户参考号,传参为
%:条件等价于Cust.Ref LIKE '%' OR Cust.Ref IS NULL,所有行都符合条件,Nominal Codes筛选正常返回34条结果。 - 按客户参考号筛选,传参为例如
A%:后半段条件'A%' = '%'不成立,仅返回Cust.Ref符合A%规则的非NULL记录,不会带出多余的NULL值行。
方案2:空值替换法(仅需传一次参数)
如果你的业务逻辑中Cust.Ref不会存储空字符串,可使用COALESCE将NULL值替换为空字符串后再做匹配:
WHERE COALESCE(Cust.Ref, '') LIKE ?
效果验证
- 不筛选客户参考号,传参为
%:空字符串匹配%,NULL值行会被正常包含。 - 按客户参考号筛选,传参为非全通配的筛选值:空字符串无法匹配例如
A%的规则,NULL值行会被自动过滤。
内容的提问来源于stack exchange,提问作者MKD
相关产品推荐
相关产品推荐

