私は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番目の条件が機能します。
今のところ、それは構文エラーを出しているので、誰でもこれを行う方法を教えてもらえますか?
このように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%'