2010-10-07 8 views
11

Esiste un modo per utilizzare un campo calcolato nella clausola where?C'è un modo per usare un campo calcolato nella clausola where?

voglio fare qualcosa di simile

SELECT a, b, a+b as TOTAL FROM (
    select 7 as a, 8 as b FROM DUAL 
    UNION ALL 
    select 8 as a, 8 as b FROM DUAL 
    UNION ALL 
    select 0 as a, 0 as b FROM DUAL 
) 
WHERE TOTAL <> 0 
; 

ma ottengo ORA-00904: "TOTALE": identificatore non valido.

quindi devo usare

SELECT a, b, a+b as TOTAL FROM (
    select 7 as a, 8 as b FROM DUAL 
    UNION ALL 
    select 8 as a, 8 as b FROM DUAL 
    UNION ALL 
    select 0 as a, 0 as b FROM DUAL 
) 
WHERE a+b <> 0 
; 

risposta

31

Logicamente, la clausola select è una delle ultime parti di una query valutati, così gli alias e le colonne derivate non sono disponibili. (. Tranne per order by, che logicamente accade scorso)

Utilizzando una tabella derivata è lontano intorno a questo:

select * 
from (SELECT a, b, a+b as TOTAL FROM ( 
      select 7 as a, 8 as b FROM DUAL 
      UNION ALL 
      select 8 as a, 8 as b FROM DUAL 
      UNION ALL 
      select 0 as a, 0 as b FROM DUAL) 
    ) 
WHERE TOTAL <> 0 
; 
+0

potrebbe anche usare un CTE. – onedaywhen

+1

Stavo provando questo in una stored procedure e la sintassi di cui sopra non avrebbe funzionato a meno che non avessi assegnato un alias anche alla tabella derivata. – DilbertDave

+0

@DilbertDave, interessante. Stavi provando in Oracle? Se ricordo correttamente, SQL Server richiedeva sempre l'aggiunta di tabelle derivate. –

Problemi correlati