Oracle SQL如何简洁筛选两列不等(NULL视为相等)的记录
Oracle下两列不等值筛选(兼容NULL特殊判定规则)
需求规则
需筛选COST1与COST2值不相等的行,判定逻辑:
- 两列均为
NULL时视为相等,不纳入结果集 - 不得将
NULL值默认等同于0处理 - 测试数据集共5行,预期返回3行:
(-100,NULL)、(NULL,0)、(0,100)
测试数据构造SQL:
with workorder (cost1,cost2) as ( select 1, 1 from dual union all select -100, null from dual union all select null, 0 from dual union all select 0, 100 from dual union all select null, null from dual ) select * from workorder
最简实现(优先推荐)
Oracle 12cR2及以上版本原生支持ANSI标准的IS DISTINCT FROM语法,和SQLite中is not的比较逻辑完全一致,写法最简洁:
with workorder (cost1,cost2) as ( select 1, 1 from dual union all select -100, null from dual union all select null, 0 from dual union all select 0, 100 from dual union all select null, null from dual ) select * from workorder where cost1 IS DISTINCT FROM cost2;
该语法的NULL处理逻辑天然匹配需求:两个NULL比较返回相等(即不满足DISTINCT判定,会被过滤),单边NULL与任意非NULL值比较返回不等,非NULL值按常规数值等值规则判断。
低版本兼容写法
如果使用12cR2以前的老版本Oracle,没有上述语法,可以直接用DECODE函数实现完全等价的逻辑,不需要写冗长的多分支IS NULL判断:
with workorder (cost1,cost2) as ( select 1, 1 from dual union all select -100, null from dual union all select null, 0 from dual union all select 0, 100 from dual union all select null, null from dual ) select * from workorder where decode(cost1, cost2, 1, 0) = 0;
DECODE函数本身的等值判定逻辑就将两个NULL视为相等,单边NULL视为不等,正好匹配需求规则,写法足够精简。
内容的提问来源于stack exchange,提问作者User1974
相关产品推荐
相关产品推荐

