6
votes

SQL sous-requête corrélée dans une clause de cas

est-il possible d'écrire une sous-requête dans une clause de cas pour la déclaration

IE. P>

CASE  
WHEN colC = '1' THEN ( select colR, colV, colX FROM...),  
WHEN colC = '2' THEN (SELECT ColS, ColD FROM...),  
ELSE 'doesn't work'  
END AS colD


0 commentaires

3 Réponses :


2
votes

Les déclarations de cas évaluent à une seule valeur, vous ne pouvez donc pas retourner plusieurs colonnes d'eux. Vous pouvez utiliser des sous-requêtes corrélées dans votre clause WHERE WHERE, bien que vous ne montriez pas d'exemple où vous avez essayé de l'utiliser. Que ce soit ou non colc fonctionnera dans la clause WHERE dépendra de votre moteur de base de données. J'ai travaillé avec certains qui le font et d'autres qui vous obligent à réexécuter la sous-requête dans la clause WHERE.


1 commentaires

Merci pour l'explication! Juste un fyi, il fonctionne pour DB2.



1
votes

est-il possible d'écrire une sous-requête dans une clause de cas pour la déclaration

Oui. Comme g.d.d.c répondit, il doit s'agir d'une sous-requête qui retourne une valeur unique. Cela signifie zéro ou une rangée et une colonne ou une valeur.

est-il possible de faire quelque chose en fonction de cette colonne de valeur?

Oui, avec les mêmes réserves que ci-dessus.

En outre, le cas ci-dessus est autorisé à renvoyer plusieurs colonnes différentes et différentes en fonction de la valeur COLC?

Non. La sous-requête doit renvoyer zéro ou une ligne et une seule colonne ou une seule valeur.


0 commentaires

5
votes

est-il possible d'écrire une sous-requête dans une clause de cas pour le moment où déclaration p>

Je pense que c'est ce que vous demandez: p> xxx pré>


est-il possible de faire quelque chose basé sur quelque chose sur cette colonne de valeur? P> blockquote>

Vous pouvez le faire, ce qui utilise Cola plutôt que Colc dans le deuxième cas code> EXPRESSION: P>

SELECT DT1.colA, DT1.colB, DT1.colC, 
       CASE 
          WHEN DT1.colC = '1' THEN (SELECT colA FROM tab2)
          WHEN DT1.colC = '2' THEN (SELECT colB FROM tab3)
          ELSE 'doesn''t work'
       END AS colD
  FROM (       
        SELECT colA, colB,
               CASE 
                  WHEN EXISTS (SELECT * FROM tab2 WHERE tab2.colA = tab1.colA) 
                     THEN '1'
                  WHEN EXISTS (SELECT * FROM tab3 WHERE tab3.colA = tab3.colA) 
                     THEN '2'
                  ELSE '0'
               END AS colC
          FROM tab1
       ) AS DT1;


1 commentaires

Merci pour la suggestion et l'explication.