sql >> Databasteknik >  >> RDS >> Oracle

Använder 'case expression kolumn' i where-satsen

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 matchar ON 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 ;


  1. Hur tar man bort HTML-taggar från en sträng i SQL Server?

  2. PostgreSQL rad till kolumner

  3. Hur man skapar ett fel i en MySQL-funktion

  4. Hur man behåller snedstrecket när man undslipper citat i MySQL – CITAT()