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

如何在SQL查询的WHERE子句中使用CASE/IF语句实现分支逻辑

解决方案

你可以通过逻辑运算符组合或者CASE表达式来实现这个条件逻辑,以下是两种可行的写法:

方法一:使用逻辑运算符直接组合(推荐,性能更优)

把原有的if-else逻辑拆解成两个分支的条件组合,用OR连接,同时用括号明确优先级:

SELECT A.BELEGNR, A.BEZEICH, A.PREIS, A.BUDATUM, A.P_RG_BEZAH, B.BEDINGUNG, A.LIEFERANT,
       A.NAME, A.KENN_FREI, A.KURS, A.VALUTA_DAT
FROM   A
LEFT OUTER JOIN B ON B.BED_NR = A.ZBD AND A.SPRACHE = B.SPRACHE
WHERE
    A.P_RG_BEZAH = 0  
    AND A.KENN_FREI <> 'E'
    AND (
        -- 当GESCH_BER是002/005时的条件
        (A.GESCH_BER IN ('002', '005') AND A.LIEFERANT NOT IN ('600099', '601922'))
        OR
        -- 其他情况的条件
        (A.GESCH_BER NOT IN ('002', '005') AND A.LIEFERANT NOT IN ('600299', '601519') AND A.VALUTA_DAT > GETDATE())
    )

注意:如果GESCH_BER是数值类型,去掉002、005的单引号即可;如果是字符串类型则保留。

方法二:使用CASE表达式

如果更偏好可读性强的分支写法,可通过CASE返回标识值来判断条件是否满足(兼容性更强,适配多数SQL方言):

SELECT A.BELEGNR, A.BEZEICH, A.PREIS, A.BUDATUM, A.P_RG_BEZAH, B.BEDINGUNG, A.LIEFERANT,
       A.NAME, A.KENN_FREI, A.KURS, A.VALUTA_DAT
FROM   A
LEFT OUTER JOIN B ON B.BED_NR = A.ZBD AND A.SPRACHE = B.SPRACHE
WHERE
    A.P_RG_BEZAH = 0  
    AND A.KENN_FREI <> 'E'
    AND CASE
        WHEN A.GESCH_BER IN ('002', '005') THEN
            CASE WHEN A.LIEFERANT NOT IN ('600099', '601922') THEN 1 ELSE 0 END
        ELSE
            CASE WHEN A.LIEFERANT NOT IN ('600299', '601519') AND A.VALUTA_DAT > GETDATE() THEN 1 ELSE 0 END
    END = 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 08:54:20