ORACLE中使用not in(xxx,null)查询不出结果
背景为动态维度增量同步,判读是否存在增量的SQL为:
SELECT A.L_SERIAL_ID, A.VC_TRADE_NAME
FROM TM_HS_TTRADETYPES A
WHERE A.C_TRADE_TYPE = '0'
AND A.L_SERIAL_ID
NOT
IN
(SELECT TO_NUMBER(REGEXP_REPLACE(C.C_SOURCE_CODE ,'[^0-9]',''))
FROM TR_DYNAMIC_BOUND C
WHERE C.C_SOURCE_TYPE = '2'
)
执行之后发现无数据,在TR_DYNAMIC_BOUND 删除一条数据后,再执行这个条SQL,还是为空,没有查询出结果
根据排查发现第二句SQL的表中结果存在null值,就是TO_NUMBER(REGEXP_REPLACE(C.C_SOURCE_CODE ,'[^0-9]',''))的列存在null
导致使用条件not in时,会查询不到结果
解决办法:
SQL中将TO_NUMBER(REGEXP_REPLACE(C.C_SOURCE_CODE ,'[^0-9]',''))
进行空值处理,使用nvl, NVL(TO_NUMBER(REGEXP_REPLACE(C.C_SOURCE_CODE ,'[^0-9]','')),0)
当TO_NUMBER(REGEXP_REPLACE(C.C_SOURCE_CODE ,'[^0-9]',''))为空时,就给他0
SQL如下:
SELECT A.L_SERIAL_ID, A.VC_TRADE_NAME
FROM TM_HS_TTRADETYPES A
WHERE A.C_TRADE_TYPE = '0'
AND a.l_serial_id = '500'
AND A.L_SERIAL_ID
NOT
IN
(SELECT NVL(TO_NUMBER(REGEXP_REPLACE(C.C_SOURCE_CODE ,'[^0-9]','')),0)
FROM TR_DYNAMIC_BOUND C
WHERE C.C_SOURCE_TYPE = '2'
--AND c.c_source_code = '500'
)
就能查询出结果了。
分类:
数据库基础
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律