这很难解释,但这里有。
我希望在SELECT
子句中执行CASE条件,该子句将使用两次计算的结果来确定为列值返回哪个计算值。
也许代码示例会有所帮助:
这有效:
SELECT
A.[COLUMN1]
, B.[COLUMN1]
, CASE
WHEN A.[COLUMN2] + A.[COLUMN3] >= B.[COLUMN2] + B.[COLUMN3] THEN A.[COLUMN2] + A.[COLUMN3]
ELSE B.[COLUMN2] + B.[COLUMN3]
FROM
[TABLE_A] A
INNER JOIN [TABLE_B] B INNER JOIN ON A.ID = B.ID
这里的问题是上面的查询在case语句中被强制执行两次计算。一次是WHEN
子句,一次是THEN
子句。
我想做这样的事情,但是SQL并不满意。
SELECT
A.[COLUMN1]
, B.[COLUMN1]
, CASE
WHEN AB.X >= AB.Y THEN AB.X
ELSE AB.Y
END
FROM ((A.[COLUMN2] + A.[COLUMN3]) X, (B.[COLUMN2] + B.[COLUMN3]) Y)
FROM
[TABLE_A] A
INNER JOIN [TABLE_B] B INNER JOIN ON A.ID = B.ID
这甚至可能吗?在第二个示例中,我只计算一次值,并在case语句中引用它们,包括WHEN
和THEN
子句。
答案 0 :(得分:1)
您可以将其重新制定为
SELECT a_column1,
b_column1,
CASE
WHEN x >= y THEN x
ELSE y
END AS foo
FROM (SELECT A.[column1] A_COLUMN1,
B.[column1] B_COLUMN1,
( A.[column2] + A.[column3] ) X,
( B.[column2] + B.[column3] ) Y
FROM [table_a] A
INNER JOIN [table_b] B
ON A.id = B.id)t
但是我不确定它会有所作为,因为无论如何,每行都可以执行一次操作
答案 1 :(得分:1)
我更倾向于将计算推送到每个表格中。这使查询的结构非常相似。因此,语法正确(或几乎正确)的版本将是:
SELECT A.[COLUMN1], B.[COLUMN1],
(CASE WHEN a.col_2_3 >= b.col_2_3 THEN a.col_2_3
ELSE b.col_2_3
end)
FROM (select a.*, (A.[COLUMN2] + A.[COLUMN3]) as col_2_3
from [TABLE_A] a
) a INNER JOIN
(select b.*, (B.[COLUMN2] + B.[COLUMN3]) as col_2_3
from [TABLE_B] b
)b
ON a.ID = b.ID
性能有很多重要因素,简单计算的开销不是其中之一。读取数据和连接是比简单计算更昂贵的方式。
但是,由于一些原因,将变量移动到子查询中很有用。首先,计算可能更昂贵(比如使用子查询)。它还有助于提高可读性和可维护性。
最后,SQL引擎可以决定只评估这些表达式一次。在实践中,我猜测没有人会进行那种微不足道的优化。