En utilisant "case expression column" dans where clause

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

cela échoue:

ORA-00904: "%s: identifiant invalide"

y a-t-il un moyen de surmonter cette limitation dans Oracle 10.2 SQL ? Comment utiliser la colonne 'case expression column' dans where clause ?

20
demandé sur OMG Ponies 2011-07-01 12:50:44
la source

6 ответов

la raison de cette erreur est que SQL SELECT déclarations sont logiquement * traitées dans l'ordre suivant:

  • FROM : sélection d'une table ou de plusieurs tables jointes et de toutes les combinaisons de lignes qui correspondent aux conditions ON .

  • WHERE : les conditions sont évaluées et les lignes qui ne correspondent pas sont supprimés.

  • GROUP BY : les lignes sont groupées (et chaque groupe s'effondre à une ligne)

  • HAVING : les conditions sont évaluées et les lignes qui ne correspondent pas sont retirées.

  • SELECT : liste des colonnes est évaluée.

  • DISTINCT : les lignes dupliquées sont supprimées (si C'est une déclaration distincte)

  • UNION , EXCEPT , INTERSECT : l'action de cet opérande est prise sur les lignes des instructions de sous-sélection. Par exemple, si c'est une UNION, toutes les lignes sont rassemblées (et les doublons éliminés sauf S'il S'agit D'une UNION tout) après que tous les énoncés de sous-Sélection ont été évalués. En conséquence pour les cas exceptés ou intersectés.

  • ORDER BY : les rangées sont ordonnées.

par conséquent, vous ne pouvez pas utiliser dans la clause WHERE , quelque chose qui n'a pas encore été peuplé ou calculé. Voir aussi la question: oracle-sql-clause-l'évaluation-la commande

* logiquement traité: notez que les moteurs de base de données peuvent aussi bien choisir un autre ordre d'évaluation pour une requête (et c'est ce qu'ils font habituellement!) La seule restriction est que les résultats doivent être les mêmes que si l'ordre ci-dessus était utilisé .


est de enclose la requête dans un autre :

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' ;

ou à dupliquer le calcul dans la condition où :

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' ;

je suppose que c'est une version simplifiée de votre requête ou vous pouvez utiliser:

SELECT ename
     , job
     , 'SALES' AS department
FROM emp
WHERE deptno = 20 ;
37
répondu ypercubeᵀᴹ 2017-05-23 15:09:40
la source

votre tableau ne contient pas de colonne" ministère "et vous ne pouvez donc pas y faire référence dans votre clause "où". Utilisez plutôt deptno.

SELECT ename
,      job
,      CASE deptno
          WHEN 10
          THEN 'ACCOUNTS'
          WHEN 20
          THEN 'SALES'
          ELSE 'UNKNOWN'
       END AS department
FROM   emp /* !!! */ where deptno = 20;
7
répondu Martin Schapendonk 2011-07-01 12:59:24
la source

ce travail pour moi:

SELECT ename, job
FROM   emp 
WHERE CASE WHEN deptno = 10 THEN 'ACCOUNTS'
           WHEN deptno = 20 THEN 'SALES'
           ELSE 'UNKNOWN'  
      END
      = 'SALES'
4
répondu Cyril Gandon 2011-07-01 13:01:22
la source
select emp_.*
from (SELECT ename
  ,    job
  ,    CASE deptno
         WHEN 10
           THEN 'ACCOUNTS'
         WHEN 20
           THEN 'SALES'
         ELSE 'UNKNOWN'
       END AS department
FROM emp /* !!! */ ) emp_ where emp_.department='UNKNOWN';
1
répondu Amitābha 2013-04-21 06:10:41
la source

, essayez:

  SQL> SELECT ename
      2  ,      job
      3  ,      CASE
      4            WHEN  deptno = 10
      5            THEN 'ACCOUNTS'
      6            WHEN  deptno = 20
      7            THEN 'SALES'
     12            ELSE 'UNKNOWN'
     13         END AS department
     14  FROM   emp /* !!! */ where department = 'SALES';
0
répondu marchaos 2011-07-01 12:55:30
la source

Oracle essaie de filtrer le nombre d'enregistrements à scanner à partir de la table en allant pour la clause où d'abord avant de sélectionner qui est la raison pour laquelle votre requête échoue. De plus, votre requête n'aurait jamais retourné les lignes avec department - "Accounts or Unknown" à cause du filtre Department= "SALES "

essayez plutôt ci-dessous, qui sera facile à trouver par le moteur:

sélectionner ename, job,' SALES ' AS department À PARTIR d'emp Où deptno = 20;

0
répondu Himansh Gautam 2016-01-14 16:38:57
la source

Autres questions sur