Oracle
 sql >> база данни >  >> RDS >> Oracle

Използване на „колона с израз на случай“ в клауза where

Причината за тази грешка е, че SQL SELECT твърденията салогически * обработени в следния ред:

  • FROM :избор на една таблица или много JOINED и всички комбинации от редове, които съответстват на ON условия.

  • WHERE :условията се оценяват и редовете, които не съвпадат, се премахват.

  • GROUP BY :редовете са групирани (и всяка група се свива до един ред)

  • HAVING :условията се оценяват и редовете, които не съвпадат, се премахват.

  • SELECT :списъкът с колони се оценява.

  • DISTINCT :дублиращите се редове се премахват (ако е израз SELECT DISTINCT)

  • UNION , EXCEPT , INTERSECT :действието на този операнд се предприема върху редовете на под-SELECT оператори. Например, ако е UNION, всички редове се събират (и дубликатите се елиминират, освен ако не е UNION ALL), след като бъдат оценени всички изрази под-SELECT. Съответно за случаите EXCEPT или INTERSECT.

  • ORDER BY :редовете са подредени.

Следователно не можете да използвате в WHERE клауза, нещо, което все още не е попълнено или изчислено. Вижте също този въпрос:oracle-sql-clause-evaluation-order

Обърнете внимание, че двигателите на базата данни могат също да изберат друг ред на оценка за заявка (и това е, което обикновено правят!) Единственото ограничение е, че резултатите трябва да са същите, както ако се използва горният ред .

Решението е дазаключите заявката в другата :

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

или за дублиране на изчислението в условието 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' ;

Предполагам, че това е опростена версия на вашата заявка или бихте могли да използвате:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-01036:незаконно име/номер на променлива при изпълнение на заявка през C#

  2. Защо DECODE на Oracle ми дава различна стойност от NVL?

  3. Предайте и връщайте персонализиран обект на масив в ibatis и оракул в java

  4. PL/SQL - Използване на променлива на списък в клауза Where In

  5. Как да използвам променливи в Oracle SQL Developer?