如何在WHERE子句中使用CASE表达式?

时间:2016-02-12 07:28:00

标签: db2

我在WHERE子句中使用CASE表达式,如下所示:

SELECT *    
FROM    ASPECT.WR_AM_ADT_SUMM
INNER JOIN ASPECT.WR_AM_DLR_DTL
ON    AS_CNTRY_CD = DD_CNTRY_CD AND 
    AS_DLR_CD = DD_DLR_CD AND 
    AS_YEAR = DD_YEAR
RIGHT JOIN ASPECT.DEALER_MASTER
ON    COUNTRY_CD = AS_CNTRY_CD AND 
    DEALER_CDE_VEGA = AS_DLR_CD
WHERE
    COUNTRY_CD = '81930' AND 
    LANG_CD = '02' AND 
    (CASE PARM_ADTR_ID 
       WHEN 'ALL' THEN (AS_ADTR_ID_P IS NULL OR AS_ADTR_ID_P LIKE '%') 
       ELSE AS_ADTR_ID_P LIKE LOC_ADTR_ID 
    END) AND 
    DEALER_CDE_VEGA LIKE '8%'
    ;

在上面的查询中,当我在PARM_ADTR_ID输入参数中传递'ALL'时,第一个条件应该有效,否则第二个条件应该有效。

截至目前,它正在给出语法错误,有人可以告诉我该怎么做吗?

1 个答案:

答案 0 :(得分:2)

我不相信你可以在一个案例表达式中THEN右边的结果 - rexpression 导致布尔值的逻辑测试。

我通常在没有案例陈述的情况下这样做

WHERE
    COUNTRY_CD = '81930' 
    and LANG_CD = '02'  
    and DEALER_CDE_VEGA LIKE '8%'
    and ( PARM_ADTR_ID = 'ALL' 
           or AS_ADTR_ID_P LIKE LOC_ADTR_ID 
        )

只有一个OR条款必须为真。虽然我希望看到PARM_ADTR_ID两次这样:

WHERE
    COUNTRY_CD = '81930' 
    and LANG_CD = '02'  
    and DEALER_CDE_VEGA LIKE '8%'
    and ( PARM_ADTR_ID = 'ALL' 
           or AS_ADTR_ID_P LIKE parm_adtr_id 
        )