70 votes

PostgreSQL : utiliser une colonne calculée dans la même requête

J'ai du mal à utiliser une colonne calculée dans postgres. Un code similaire qui fonctionne en SQL est donné ci-dessous, est-il possible de le recréer en PostgreSQL ?

 select cost_1, quantity_1, cost_2, quantity_2, 
      (cost_1 * quantity_1) as total_1,
      (cost_2 * quantity_2) as total_2,
      (calculated total_1 + calculated total_2) as total_3
from data;

Dans PostgreSQL un code similaire renvoie l'erreur qui :

les colonnes total_1 et total_2 n'existent pas.

61voto

a_horse_with_no_name Points 100769

Vous devez encapsuler l'instruction SELECT dans une table dérivée afin de pouvoir accéder à l'alias de colonne :

 select cost1,
       quantity_1,
       cost_2,
       quantity_2
       total_1 + total_2 as total_3
from (
    select cost_1, 
           quantity_1, 
           cost_2, 
           quantity_2, 
           (cost_1 * quantity_1) as total_1,
           (cost_2 * quantity_2) as total_2
    from data
) t

Il n'y aura pas de pénalité de performance à ce sujet.

(Je suis vraiment surpris que votre instruction SQL d'origine s'exécute dans un SGBD)

1voto

Sarah Points 73
select cost_1, quantity_1, cost_2, quantity_2, 
      cost_1 * quantity_1 as total_1,
      cost_2 * quantity_2 as total_2,
      (cost_1 * quantity_1 + cost_2 * quantity_2) as total_3
from data;

-4voto

tponthieux Points 358

Vous essayez d'utiliser des alias de colonne dans une expression. Si un système vous permet de le faire, c'est juste du sucre syntaxique. Cela devrait fonctionner dans n'importe quel dialecte SQL.

 select 
 cost_1
,quantity_1
,cost_2
,quantity_2
,cost_1 * quantity_1 as total_1
,cost_2 * quantity_2 as total_2
,(cost_1 * quantity_1) + (cost_2 * quantity_2) as total_3 

from data;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X