web-dev-qa-db-fra.com

Comment utiliser une expression CASE dans la clause WHERE?

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?

4
Govind

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%'
5
mustaccio