PostgreSQL: использование вычисленного столбца в том же запросе

У меня возникли проблемы с использованием расчетного столбца в postgres. Аналогичный код, который работает в SQL, приведен ниже, возможно ли воссоздать его в 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;

В PostgreSQL аналогичный код возвращает ошибку, которая:

столбца total_1 и total_2 не существует.

Вам нужно обернуть инструкцию SELECT в производную таблицу, чтобы иметь доступ к псевдониму столбца:

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

На это не будет никаких штрафных санкций.

действительно удивлен, что ваш исходный оператор SQL работает вообще в СУБД)

33
ответ дан 12 янв. '12 в 23:35
источник

Если вам не нравится перенос всего запроса с внешним запросом, вы можете использовать LATERAL для вычисления промежуточных total_1 и total_2:

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

Выход:

╔═════════╦═════════════╦═════════╦═════════════╦══════════╦══════════╦═════════╗
║ 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 ║
╚═════════╩═════════════╩═════════╩═════════════╩══════════╩══════════╩═════════╝
17
ответ дан 10 апр. '16 в 16:13
источник

Как правило, есть две вещи, которые вы должны знать о предложении SELECT:

  • Хотя он написан первым, он оценивается последним, за исключением предложения ORDER BY. Вот почему вы не можете использовать какие-либо вычисляемые поля или псевдонимы в любом другом предложении (особенно в WHERE), кроме предложения ORDER BY.
  • Вычисления в предложении SELECT выполняются параллельно или, по крайней мере, обрабатываются так, как если бы они были. Вот почему вы не можете использовать один расчет как часть другого.

Таким образом, краткий ответ, что вы не можете, и это по замыслу.

Заметным исключением является Microsoft Access, где вы действительно можете использовать вычисления в последующих столбцах и WHERE. Однако, хотя это удобно, на самом деле это не является преимуществом: невыполнение вышеуказанных принципов менее эффективно. Но это нормально для легковесных баз данных, для которых предполагается использовать Access.

Если вы действительно хотите повторно использовать вычисленные результаты, вам понадобится отдельный запрос, либо в форме подзапроса, либо в виде общего выражения таблицы. С CTE работать намного проще, так как их легче читать.

редактировать

Не меняя смысла первоначального ответа, я подумал, что могу добавить, что думаю, что это объяснение, возможно, немного подло.

Современные СУБД прикладывают большие усилия к планированию и оптимизации запросов, поэтому более не правильно, если вообще когда-либо, что запрос действительно выполняется в определенном порядке. Насколько я вижу, нет технической причины, по которой оптимизатор не мог смотреть в будущее и включать вычисленные результаты в синтаксический анализ запроса, даже если он предназначен только для замены выражений.

Ну что ж …

9
ответ дан 10 марта '17 в 10:17
источник
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;
0
ответ дан 21 июля '18 в 2:13
источник

Вы пытаетесь использовать псевдонимы столбцов в выражении. Если система позволяет вам это сделать, это просто синтаксический сахар. Это должно работать на любом диалекте 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;
-3
ответ дан 12 янв. '12 в 21:33
источник