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

SQL查询WHERE子句使用多条件IF报156语法错误如何解决

问题修复方案

错误原因

你遇到的语法错误核心原因是:T-SQL 不允许在 WHERE 子句内部直接使用 IF 流程控制语句,IF 属于T-SQL的流程控制关键字,只能用来控制整段SQL语句块的执行逻辑,不能嵌入到WHERE的条件判断表达式中。

修复方案

提供两种常用的实现方式,你可以根据业务场景选择:

方案1:布尔逻辑改写WHERE条件(推荐,无需重复写SELECT字段逻辑)

直接用OR/AND组合替代IF逻辑,不需要调整SELECT的字段部分,修改后的代码如下:

-- 前置参数校验,避免两个参数同时为空
IF (@A IS NULL OR @A = '') AND (@B IS NULL OR @B = '')
BEGIN
    RAISERROR('参数@A和@B不能同时为空',16,1)
    RETURN
END

SELECT
    [DOC].[ety_ts] as [CreatedDate],
    [DOC].[ord_int_id],
    [DOC].[doc_int_id],
    [pnt_cln_doc_int_id] as [ParentDoc],
    CDTL_STATUS2.cod_dtl_ds as DocumentName,
    CDTL_STATUS.[cod_dtl_ds] as [DocumentStatus]
    -- 剩余你省略的字段
-- 你原来的表关联逻辑完整保留
WHERE 
-- 当@A为空时走@B的查询逻辑
(
    (@A IS NULL OR @A = '')
    AND DOC.asn_int_id = (SELECT asn_int_id FROM TPM WITH(NOLOCK) WHERE rec_no = @B)
)
-- 当@A不为空时走@A的查询逻辑
OR
(
    @A <> ''
    AND DOC.ord_int_id IN (
        SELECT TPM.ord_int_id FROM TPM_VISIT TPM WITH (NOLOCK)
        WHERE TPM.vst_no = @A
    )
)

注:你原有代码中嵌套了一层多余的TAD_DOCUMENT子查询,没有任何逻辑作用,已经简化移除,可提升查询性能。

方案2:IF控制整段SELECT执行(适合两段查询逻辑差异大的场景)

如果后续两段查询的字段或者表关联逻辑有差异,可以用IF分别控制完整的SELECT语句执行:

-- 前置参数校验
IF (@A IS NULL OR @A = '') AND (@B IS NULL OR @B = '')
BEGIN
    RAISERROR('参数@A和@B不能同时为空',16,1)
    RETURN
END

IF (@A IS NULL OR @A = '')
BEGIN
    SELECT
        [DOC].[ety_ts] as [CreatedDate],
        [DOC].[ord_int_id],
        [DOC].[doc_int_id],
        [pnt_cln_doc_int_id] as [ParentDoc],
        CDTL_STATUS2.cod_dtl_ds as DocumentName,
        CDTL_STATUS.[cod_dtl_ds] as [DocumentStatus]
        -- 剩余字段
    -- 你的表关联逻辑
    WHERE DOC.asn_int_id = (SELECT asn_int_id FROM TPM WITH(NOLOCK) WHERE rec_no = @B)
END
ELSE
BEGIN
    SELECT
        [DOC].[ety_ts] as [CreatedDate],
        [DOC].[ord_int_id],
        [DOC].[doc_int_id],
        [pnt_cln_doc_int_id] as [ParentDoc],
        CDTL_STATUS2.cod_dtl_ds as DocumentName,
        CDTL_STATUS.[cod_dtl_ds] as [DocumentStatus]
        -- 剩余字段
    -- 你的表关联逻辑
    WHERE DOC.ord_int_id IN (
        SELECT TPM.ord_int_id FROM TPM_VISIT TPM WITH (NOLOCK)
        WHERE TPM.vst_no = @A
    )
END

注意事项

  • 使用WITH(NOLOCK)查询时会读取到未提交的脏数据,如果业务对数据一致性要求较高不建议使用
  • 如果需要支持两个参数同时传入的场景,可自行调整WHERE的逻辑判断规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:18:03