Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Używanie 'kolumny wyrażenia przypadku' w klauzuli where

Powodem tego błędu jest to, że SQL SELECT stwierdzenia są logicznie * przetwarzane w następującej kolejności:

  • FROM :wybór jednej tabeli lub wielu połączonych i wszystkich kombinacji wierszy, które pasują do ON warunki.

  • WHERE :warunki są oceniane, a niepasujące wiersze są usuwane.

  • GROUP BY :wiersze są pogrupowane (i każda grupa zwija się do jednego wiersza)

  • HAVING :warunki są oceniane, a niepasujące wiersze są usuwane.

  • SELECT :lista kolumn jest oceniana.

  • DISTINCT :zduplikowane wiersze są usuwane (jeśli jest to instrukcja SELECT DISTINCT)

  • UNION , EXCEPT , INTERSECT :akcja tego operandu jest wykonywana na wierszach instrukcji sub-SELECT. Na przykład, jeśli jest to UNION, wszystkie wiersze są zbierane (i duplikaty są eliminowane, chyba że jest to UNION ALL) po przeanalizowaniu wszystkich instrukcji podrzędnych SELECT. Odpowiednio dla przypadków EXCEPT lub INTERSECT.

  • ORDER BY :wiersze są uporządkowane.

Dlatego nie możesz używać w WHERE klauzula, coś, co nie zostało jeszcze wypełnione ani obliczone. Zobacz też to pytanie:oracle-sql-clause-evaluation-order

Zauważ, że silniki baz danych mogą równie dobrze wybrać inną kolejność oceny dla zapytania (i tak zwykle robią!) Jedynym ograniczeniem jest to, że wyniki powinny być takie same, jak w przypadku użycia powyższej kolejności .

Rozwiązaniem jest umieszczanie zapytania w innym :

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

lub duplikować obliczenia w warunku 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' ;

Myślę, że jest to uproszczona wersja Twojego zapytania lub możesz użyć:

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. Jak uzyskać informacje o właścicielu indeksu i tabeli w Oracle?

  2. Jak ROWNUM działa w zapytaniu o paginację?

  3. Wybierz liczbę (*) z wielu tabel

  4. Dwie instrukcje PLSQL z początkiem i końcem działają dobrze osobno, ale nie razem?

  5. Jak przekonwertować wiersze na kolumny w Oracle?