J'utilise une expression CASE
dans ma clause WHERE
comme ceci:
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%'
;
Dans la requête ci-dessus lorsque je passe 'ALL'
dans PARM_ADTR_ID
paramètre d'entrée alors la première condition devrait fonctionner, sinon la deuxième condition devrait fonctionner.
À partir de maintenant, cela donne l'erreur de syntaxe, est-ce que quelqu'un pourrait me dire comment faire?
Vous ne pouvez pas utiliser l'expression CASE
dans DB2 de cette façon. Le résultat d'une expression CASE
ne peut pas être une valeur booléenne. Votre clause WHERE
pourrait ressembler à ceci, si l'on devait traduire aveuglément votre code:
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%'
Cependant, si vous supprimez les conditions redondantes, cela peut être simplifié comme ça (HT à ypercubeᵀᴹ, qui se réveille plus tôt :)
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%'