2010-10-07 28 views
11

Il existe un moyen d'utiliser un champ calculé dans la clause where?Il existe un moyen d'utiliser un champ calculé dans la clause where?

Je veux faire quelque chose comme

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 
; 

mais je reçois ORA-00904: "TOTAL": identificateur non valide.

donc je dois utiliser

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 
; 

Répondre

31

Logiquement, la clause select est l'une des dernières parties d'une requête évaluée, de sorte que les alias et les colonnes dérivées ne sont pas disponibles. (. Sauf order by, qui logiquement arrive dernier)

En utilisant une table dérivée se trouve autour de cette:

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

pourrait également utiliser un CTE. – onedaywhen

+1

J'essayais ceci dans une procédure stockée et la syntaxe ci-dessus ne fonctionnerait pas à moins que j'aie aliasé la table dérivée aussi bien. – DilbertDave

+0

@DilbertDave, intéressant. Étiez-vous en train d'essayer Oracle? Si je me souviens bien, SQL Server a toujours exigé que les tables dérivées soient aliasées. –