web-dev-qa-db-ja.com

WHERE句でCASE式を使用する方法

私はCASE句でWHERE式を次のように使用しています:

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%'
        ;

上記のクエリで'ALL'入力パラメーターにPARM_ADTR_IDを渡すと、最初の条件が機能し、そうでなければ2番目の条件が機能します。

今のところ、それは構文エラーを出しているので、誰でもこれを行う方法を教えてもらえますか?

4
Govind

このようにDB2でCASE式を使用することはできません。 CASE式の結果をブール値にすることはできません。コードを盲目的に翻訳すると、WHERE句は次のようになります。

WHERE
    COUNTRY_CD = '81930' AND 
    LANG_CD = '02' AND (
      ( PARM_ADTR_ID = 'ALL'  
        AND (AS_ADTR_ID_P IS NULL OR AS_ADTR_ID_P LIKE '%') ) 
       OR
      ( (PARM_ADTR_ID != 'ALL' OR PARM_ADTR_ID IS NULL)  
        AND AS_ADTR_ID_P LIKE LOC_ADTR_ID )
    ) AND 
    DEALER_CDE_VEGA LIKE '8%'

ただし、冗長な条件を削除すると、次のように簡略化できます(HTからypercube toへ、早く目覚める人:)

WHERE
    COUNTRY_CD = '81930' AND 
    LANG_CD = '02' AND (
      PARM_ADTR_ID = 'ALL' OR AS_ADTR_ID_P LIKE LOC_ADTR_ID
    ) AND 
    DEALER_CDE_VEGA LIKE '8%'
5
mustaccio