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 ;