Если вы пишете сложный SELECT, в котором одно и тоже вычисляется несколько раз, например, для массовой обработки данных пачками, то наверняка вам хотелось завести локальную переменную
вот пример:
SELECT
price * quantity AS total_price,
(price * quantity) * 0.15 AS tax,
((price * quantity) + ((price * quantity) * 0.15)) AS grand_total
FROM orders;
Здесь price * quantity вычисляется несколько раз, и tax вычисляется дважды. Но это выглядит еще ок, в реальности это зачастую всякие монструозные свитч-кейсы с NULLIF, COALESCE и прочими ребятами.
Но не суть, вам хочется один раз вычислить значение, без дублирования кода.
Это делается так
SELECT
o.item_name,
o.price,
o.quantity,
v1.subtotal, -- используем переменные
v2.tax,
v1.subtotal + v2.tax as grandtotal
FROM orders o
-- "Объявляем" subtotal
CROSS JOIN LATERAL (
SELECT o.price * o.quantity AS subtotal
) AS v1
-- "Объявляем" tax, используя subtotal
CROSS JOIN LATERAL (
SELECT v1.subtotal * 0.15 AS tax
) AS v2
Т.е. мы выделяем расчеты в cross join lateral, давай получившимся полям человеческие имена. И хотя в целом строк больше, но меньше дублирования кода, в котором можно ошибиться, и читается это зачастую проще.
https://www.db-fiddle.com/f/wSnCfpqzZypaPXSnsVUaYi/0
🫥 Cross Join - канал о разработке
⠀