TGViewer
Cross Join - канал о разработке Cross Join - канал о разработке @crossjoin · 3.81K subscribers
Post #604 2.61K
Интересный хак для упрощения запросов Postgres

Если вы пишете сложный 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 - канал о разработке
⠀
Telegram Cross Join - канал о разработке Канал о разработке Антона Околелова. Разрабочик/ex-тимлид Go, живу в Чехии. Мысли, новости, вопросы. По вопросам рекламы @antonokolelov
  • 👍 36
  • ❤ 11
  • 🔥 6
  • 🥴 2
More from @crossjoin
  1. Sep 28, 2026Слышал недавно в каком-то подкасте мысль, что Haskell плохо подходит для вайбкодинга прост…
  2. Sep 26, 2026Антон Жиянов написал мини-книгу по Go-concurrency. Это что-то вроде плотного конспекта с и…
  3. Sep 22, 2026photo post
  4. Sep 14, 2026Поможем Руслану собрать фидбек. Проект некоммерческий 👆
  5. Sep 14, 2026AGBX (Agent Box) — небольшой open-source CLI для запуска Claude Code и Codex в изолированн…
  6. Sep 5, 2026Обалдеть, что творится. На Рейтерс вышла статья, в которой утверждается, что, помимо сканд…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →