sql >> Databáze >  >> RDS >> Oracle

Použití „sloupec výrazu případu“ v klauzuli where

Důvodem této chyby je, že SQL SELECT výroky jsou logicky * zpracovány v následujícím pořadí:

  • FROM :výběr jedné tabulky nebo mnoha SPOJENÝCH a všech kombinací řádků, které odpovídají ON podmínky.

  • WHERE :podmínky jsou vyhodnoceny a řádky, které se neshodují, jsou odstraněny.

  • GROUP BY :řádky jsou seskupeny (a každá skupina se sbalí do jednoho řádku)

  • HAVING :podmínky jsou vyhodnoceny a řádky, které se neshodují, jsou odstraněny.

  • SELECT :vyhodnotí se seznam sloupců.

  • DISTINCT :duplicitní řádky jsou odstraněny (pokud se jedná o příkaz SELECT DISTINCT)

  • UNION , EXCEPT , INTERSECT :akce tohoto operandu je provedena na řádcích příkazů sub-SELECT. Například, pokud se jedná o UNION, všechny řádky jsou shromážděny (a duplikáty odstraněny, pokud se nejedná o UNION ALL) po vyhodnocení všech dílčích příkazů SELECT. Obdobně pro případy EXCEPT nebo INTERSECT.

  • ORDER BY :řádky jsou seřazeny.

Proto nemůžete použít v WHERE klauzule, něco, co ještě nebylo naplněno nebo vypočítáno. Viz také tato otázka:oracle-sql-clause-evaluation-order

Upozorňujeme, že databázové stroje mohou také zvolit jiné pořadí hodnocení dotazu (a to je to, co obvykle dělají!) Jediným omezením je, že výsledky by měly být stejné, jako kdyby bylo použito výše uvedené pořadí .

Řešením je umístit dotaz do jiného :

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

nebo duplikovat výpočet v podmínce 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' ;

Předpokládám, že toto je zjednodušená verze vašeho dotazu nebo můžete použít:

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


  1. Najděte index posledního výskytu podřetězce pomocí T-SQL

  2. Jak FROM_DAYS() funguje v MariaDB

  3. Jak prohledávat více sloupců v MySQL?

  4. Jak zadat číslo portu v připojovacím řetězci SQL Server?