Oracle中查找特定值对应列并按关联日期条件筛选数据
Oracle SALES表指定规则数据筛选方案
问题梳理
SALES表包含如下列:
CUST_ID, DEPT,CODE1_ID,CODE2_ID,CODE3_ID,CODE1_ID_STOP_DT,CODE2_ID_STOP_DT,CODE3_ID_STOP_DT
筛选规则:任意CODE*_ID列值为100,且同序号对应的CODE*_ID_STOP_DT值为NULL或不等于31-DEC-2022。
原有SQL存在两个核心问题:
- 语法错误:语句末尾缺少右括号
- 逻辑缺陷:用
IN把三个CODE列值合并判断,丢失了值与列的对应关系,无法关联匹配同序号的STOP_DT列做日期校验
正确SQL语句
SELECT * FROM SALES WHERE (CODE1_ID = 100 AND (CODE1_ID_STOP_DT IS NULL OR CODE1_ID_STOP_DT != TO_DATE('31-DEC-2022', 'DD-MON-YYYY'))) OR (CODE2_ID = 100 AND (CODE2_ID_STOP_DT IS NULL OR CODE2_ID_STOP_DT != TO_DATE('31-DEC-2022', 'DD-MON-YYYY'))) OR (CODE3_ID = 100 AND (CODE3_ID_STOP_DT IS NULL OR CODE3_ID_STOP_DT != TO_DATE('31-DEC-2022', 'DD-MON-YYYY')));
逻辑说明
- 列绑定判断:将三组CODE列和对应序号的STOP_DT列绑定为独立判断单元,三个单元用
OR连接,只要任意一个单元满足规则即可命中,解决了原逻辑无法定位100所在列、无法关联对应日期的问题。 - 日期类型处理:使用
TO_DATE将目标日期字符串转换为日期类型再做比较,避免数据库NLS参数不一致导致的隐式转换错误或结果偏差。 - 空值兼容:单独判断STOP_DT为NULL的场景,Oracle中NULL与任何值做比较的结果都为未知,直接用不等值判断无法命中NULL值的行。
样例数据校验结果
基于提供的4条样例数据,筛选结果如下:
- CUST_ID=234:CODE2_ID=100,对应CODE2_ID_STOP_DT为NULL,符合规则,命中
- CUST_ID=345:CODE1_ID=100,对应CODE1_ID_STOP_DT为NULL,符合规则,命中
- CUST_ID=456:CODE3_ID=100,对应CODE3_ID_STOP_DT为31-OCT-2022,不等于31-DEC-2022,符合规则,命中
- CUST_ID=123:CODE3_ID=100,但对应CODE3_ID_STOP_DT为31-DEC-2022,不符合规则,排除
内容的提问来源于stack exchange,提问作者IAM_SRK
相关产品推荐
相关产品推荐

