You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 05:15:42