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
3 Réponses :
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 code> 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. P>
Merci pour l'explication! Juste un fyi, il fonctionne pour DB2.
est-il possible d'écrire une sous-requête dans une clause de cas pour la déclaration P> blockQuote>
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. P>
est-il possible de faire quelque chose en fonction de cette colonne de valeur? p> blockQuote>
Oui, avec les mêmes réserves que ci-dessus. p>
En outre, le cas ci-dessus est autorisé à renvoyer plusieurs colonnes différentes et différentes en fonction de la valeur COLC? P> blockQuote>
Non. La sous-requête doit renvoyer zéro ou une ligne et une seule colonne ou une seule valeur. P>
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;
Merci pour la suggestion et l'explication.