Anledningen till detta fel är att SQL SELECT
påståenden är logiskt * behandlas i följande ordning:
-
FROM
:val av en tabell eller många JOINerade och alla radkombinationer som matcharON
villkor. -
WHERE
:villkoren utvärderas och rader som inte matchar tas bort. -
GROUP BY
:rader grupperas (och varje grupp kollapsar till en rad) -
HAVING
:villkoren utvärderas och rader som inte matchar tas bort. -
SELECT
:lista över kolumner utvärderas. -
DISTINCT
:dubbletter av rader tas bort (om det är en SELECT DISTINCT-sats) -
UNION
,EXCEPT
,INTERSECT
:åtgärden för den operanden utförs på raderna med sub-SELECT-satser. Till exempel, om det är en UNION, samlas alla rader (och dubbletter elimineras om det inte är en UNION ALL) efter att alla sub-SELECT-satser har utvärderats. Följaktligen för EXCEPT eller INTERSECT-fallen. -
ORDER BY
:rader är ordnade.
Därför kan du inte använda i WHERE
klausul, något som inte har fyllts i eller beräknats ännu. Se även denna fråga:oracle-sql-clause-evaluation-order
Observera att databasmotorer lika gärna kan välja en annan utvärderingsordning för en fråga (och det är vad de vanligtvis gör!) Den enda begränsningen är att resultaten ska vara desamma som om ovanstående ordning användes stark> .
Lösningen är att innesluta frågan i en annan :
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' ;
eller för att duplicera beräkningen i WHERE-villkoret :
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' ;
Jag antar att detta är en förenklad version av din fråga eller så kan du använda:
SELECT ename
, job
, 'SALES' AS department
FROM emp
WHERE deptno = 20 ;