wake-up-neo.com

PostgreSQL: Verwenden einer berechneten Spalte in derselben Abfrage

Ich habe Probleme bei der Verwendung einer berechneten Spalte in Postgres. Ein ähnlicher Code, der in SQL funktioniert, ist unten angegeben. Ist es möglich, diesen in PostgreSQL neu zu erstellen?

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;

In PostgreSQL gibt ein ähnlicher Code den Fehler zurück, dass:

die Spalten total_1 und total_2 existieren nicht.

51
user1146150

Sie müssen die SELECT-Anweisung in eine abgeleitete Tabelle einschließen, um auf den Spaltenalias zugreifen zu können:

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

Darauf wird es keine Leistungseinbußen geben.

(Ich bin wirklich überrascht, dass Ihre ursprüngliche SQL-Anweisung überhaupt in einem DBMS ausgeführt wird.)

44

Wenn Sie nicht gerne die gesamte Abfrage mit Outerquery umschließen, können Sie LATERAL verwenden, um die Zwischenwerte total_1 Und total_2 Zu berechnen:

SELECT cost_1, quantity_1, cost_2, quantity_2, total_1, total_2,
       total_1 + total_2 AS total_3
FROM data
,LATERAL(SELECT cost_1 * quantity_1, cost_2 * quantity_2) AS s1(total_1,total_2);

DBFiddle Demo

Ausgabe:

╔═════════╦═════════════╦═════════╦═════════════╦══════════╦══════════╦═════════╗
║ cost_1  ║ quantity_1  ║ cost_2  ║ quantity_2  ║ total_1  ║ total_2  ║ total_3 ║
╠═════════╬═════════════╬═════════╬═════════════╬══════════╬══════════╬═════════╣
║      1  ║          2  ║      3  ║          4  ║       2  ║      12  ║      14 ║
║      3  ║          5  ║      7  ║          9  ║      15  ║      63  ║      78 ║
║     10  ║          5  ║     20  ║          2  ║      50  ║      40  ║      90 ║
╚═════════╩═════════════╩═════════╩═════════════╩══════════╩══════════╩═════════╝
27
Lukasz Szozda
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;
1
Sarah