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

SQL使用IS NULL配合IN子句处理可选参数的空值适配问题

IN子句兼容空值查询解决方案

现有写法的核心问题

  1. 逻辑运算符优先级错误:SQL中AND优先级高于OR,你原代码的WHERE条件会被数据库自动解析为不符合预期的逻辑分组:
(日期范围条件 AND E.RTCA_CD_QMNUM IN (:1)) 
OR 
(E.RTCA_CD_QMNUM IS NULL AND 其余所有过滤条件)
  1. NULL值匹配逻辑失效:当给:1传入NULL时,E.RTCA_CD_QMNUM IN (NULL)的判断结果永远为UNKNOWN,不会返回任何匹配行,原写法的OR判断因为逻辑分组错误完全没有生效。

修改后的完整SQL

SELECT E.RTCA_CD_QMNUM
      ,E.RTIT_NR_ITEM
      ,D.RTSI_NR_SUBITEM
      ,B.PLOP_DT_INICIO
      ,B.PLOP_DT_FECHAMENTO
      ,D.RTSI_DT_MAIS_CEDO
      ,A.SSRT_CD_STATUS_SUBITEM_RT
      ,D.RTSI_DT_MAIS_TARDE
      ,A.PORT_DT_INCLUSAO
      ,C.PLCO_DS_PLANEJ_CONFIG
      ,F.ROTA_NM_ROTA
      ,H.CLLO_NM_CLUSTER_LOG
      ,G.ATEM_DT_INICIO
      ,I.TIAM_DS_TIPO_ATEND_MAR 
  FROM SIGIOP.PLANEJAMENTO_OPERACIONAL_RT A
 INNER JOIN SIGIOP.PLANEJAMENTO_OPERACIONAL B ON B.PLOP_SQ_PLANEJ_OPER = A.PLOP_SQ_PLANEJ_OPER
 INNER JOIN SIGIOP.PLANEJAMENTO_CONFIG C ON C.PLCO_SQ_PLANEJ_CONFIG = B.PLCO_SQ_PLANEJ_CONFIG
 INNER JOIN SIGIOP.RT_SUBITEM D ON D.RTSI_CD_RTSUBITEM = A.RTSI_CD_RTSUBITEM
 INNER JOIN SIGIOP.RT_ITEM E ON E.RTIT_CD_RTITEM = D.RTIT_CD_RTITEM
 INNER JOIN SIGIOP.ROTA F ON F.ROTA_SQ_ROTA = A.ROTA_SQ_ROTA
 INNER JOIN SIGIOP.ATENDIMENTO_MAR G ON G.ATEM_SQ_ATEND_MAR = A.ATEM_SQ_ATEND_MAR
 INNER JOIN SIGIOP.CLUSTER_LOG H ON H.CLLO_SQ_CLUSTER_LOG = G.CLLO_SQ_CLUSTER_LOG
 INNER JOIN SIGIOP.TIPO_ATENDIMENTO_MAR I ON I.TIAM_SQ_TIPO_ATEND_MAR = G.TIAM_SQ_TIPO_ATEND_MAR
 WHERE B.PLOP_DT_FECHAMENTO >= TO_DATE(:DATAINICIAL, 'DDMMYYYY') 
   AND B.PLOP_DT_FECHAMENTO < TO_DATE(:DATAFINAL, 'DDMMYYYY')
   -- 动态判断:参数为空时跳过该过滤条件
   AND (:1 IS NULL OR E.RTCA_CD_QMNUM IN (:1))
   AND A.MORE_SQ_MOTIVO_REPLANEJ IS NULL
   AND B.PLOP_IN_STATUS = 2
 ORDER BY E.RTCA_CD_QMNUM, E.RTIT_NR_ITEM, D.RTSI_NR_SUBITEM, B.PLOP_DT_INICIO;

逻辑说明

  • 核心修改点(:1 IS NULL OR E.RTCA_CD_QMNUM IN (:1))实现了动态过滤:当传入的:1为NULL时,前半段判断直接为真,整个IN条件会被忽略,仅剩余日期等其他过滤条件生效,完全匹配你的需求;当:1为非空值时,会正常执行IN匹配逻辑。
  • 所有过滤条件用AND连接,不存在优先级混乱问题,逻辑完全可控。
  • 如果你的:1是多值入参,部分数据库需要额外处理数组类型的入参匹配,当前写法适配单值、以及原生支持多值IN参数的数据库场景。

内容的提问来源于stack exchange,提问作者AllPower

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:39:04