gpt4 book ai didi

sql - PostgreSQL 在 CASE 语句中重用长计算的值

转载 作者:行者123 更新时间:2023-11-29 11:45:02 25 4
gpt4 key购买 nike

我有以下内容:

SELECT
CASE column1
WHEN some_long_calc THEN 10
ELSE some_long_calc + 2*PI
END AS mycalc,

如何将 some_long_calc“保存”为局部变量,这样我就不需要运行它两次?

我正在使用 atan2,我想将角度范围保持在 0 到 2pi 之间

最佳答案

首先,我猜想查询优化器足够聪明,可以发现相同的确定性表达式并且不会计算两次。

如果这不适用,您可以使用 LATERAL :

SELECT *,
CASE column1
WHEN sub.long_calc THEN 10
ELSE sub.long_calc + 2 * 3.14
END AS mycalc
FROM tab t
,LATERAL (VALUES(t.a+t.b+t.c)) AS sub(long_calc);

SqlFiddleDemo

输出:

╔═════╦══════════╦════╦════╦════╦════════════╦════════╗
║ id ║ column1 ║ a ║ b ║ c ║ long_calc ║ mycalc ║
╠═════╬══════════╬════╬════╬════╬════════════╬════════╣
║ 1 ║ 6 ║ 1 ║ 2 ║ 3 ║ 6 ║ 10 ║
║ 2 ║ 20 ║ 2 ║ 3 ║ 4 ║ 9 ║ 15.28 ║
╚═════╩══════════╩════╩════╩════╩════════════╩════════╝

您可以将 VALUES 替换为简单的 SELECT 或函数调用:

-- any query
,LATERAL (SELECT t.a+t.b+t.c) AS sub(long_calc)
-- function
,LATERAL random() AS sub(long_calc)
-- function with parameter passing
,LATERAL sin(t.a) AS sub(long_calc)

SqlFiddleDemo2


编辑:

SELECT id
,sub2.long_calc_rand -- calculated once
,random() AS rand -- calculated every time
FROM tab t
,LATERAL random() AS sub2(long_calc_rand);

SqlFiddleDemo3

输出:

╔═════╦═════════════════════╦════════════════════╗
║ id ║ long_calc_rand ║ rand ║
╠═════╬═════════════════════╬════════════════════╣
║ 1 ║ 0.3426254219375551 ║ 0.8861959744244814 ║
║ 2 ║ 0.3426254219375551 ║ 0.8792812027968466 ║
║ 3 ║ 0.3426254219375551 ║ 0.8123061805963516 ║
╚═════╩═════════════════════╩════════════════════╝

关于sql - PostgreSQL 在 CASE 语句中重用长计算的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36660177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com