Maison >base de données >tutoriel mysql >Comment puis-je utiliser une colonne d'expression CASE dans la clause WHERE d'une requête Oracle 10.2 ?

Comment puis-je utiliser une colonne d'expression CASE dans la clause WHERE d'une requête Oracle 10.2 ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-04 22:46:42763parcourir

How Can I Use a CASE Expression Column in the WHERE Clause of an Oracle 10.2 Query?

Utilisation de la « colonne d'expression de cas » dans une clause WHERE dans Oracle 10.2

Dans Oracle 10.2, une erreur ORA-00904 se produit lors de la tentative de utilisez une colonne d'expression de cas dans une clause WHERE. Cela est dû à l'ordre de traitement logique des instructions SQL, où les conditions WHERE sont évaluées avant la sélection des colonnes.

Explication de l'erreur :

Les instructions SQL sont traitées logiquement dans le ordre suivant :

  • FROM : Sélection et ligne du tableau combinaisons
  • WHERE : Filtrage de lignes basé sur des conditions
  • GROUP BY : Regroupement de lignes
  • HAVING : Filtrage de lignes supplémentaire
  • SELECT : Sélection de colonnes
  • DISTINCT : ligne en double suppression
  • UNION/EXCEPT/INTERSECT : opérations de sous-requête
  • ORDER BY : classement des lignes

Dans la requête fournie, la clause WHERE tente d'utiliser la colonne de département calculée dans l'expression CASE. Cependant, cette colonne n'est renseignée qu'après l'exécution de la clause WHERE, ce qui entraîne l'erreur.

Solution 1 : Enclosure de la sous-requête

Pour surmonter cette limitation, joignez l'original requête dans une sous-requête et sélectionnez-y les colonnes souhaitées :

SELECT *
FROM
  ( SELECT ename
         , job
         , CASE deptno
             WHEN 10 THEN 'ACCOUNTS'
             WHEN 20 THEN 'SALES'
                     ELSE 'UNKNOWN'
           END AS department
    FROM emp
  ) tmp
WHERE department = 'SALES' ;

Solution 2 : Conditionnelle Réplication

Répliquer l'expression CASE dans la condition WHERE :

SELECT ename
     , job
     , CASE deptno
         WHEN 10 THEN 'ACCOUNTS'
         WHEN 20 THEN 'SALES'
                 ELSE 'UNKNOWN'
       END AS department
FROM emp
WHERE
    CASE deptno
      WHEN 10 THEN 'ACCOUNTS'
      WHEN 20 THEN 'SALES'
              ELSE 'UNKNOWN'
    END = 'SALES' ;

Solution alternative :

Si possible, envisagez d'utiliser une méthode plus simple requête :

SELECT ename
     , job
     , 'SALES' AS department
FROM emp
WHERE deptno = 20 ;

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn