我有很多计算列,他们不断重复自己,一个在其他内部,包括嵌套的case语句。
我正在寻找一种方法,有一个非常简化的版本。
SELECT
(1+2) AS A,
A + 3 AS B,
B * 7 AS C
FROM MYTABLE
提前致谢。
答案 0 :(得分:21)
你可以尝试这样的事情。
SELECT
A.Val AS A,
B.Val AS B,
C.Val AS C
FROM MYTABLE
cross apply(select 1 + 2) as A(Val)
cross apply(select A.Val + 3) as B(Val)
cross apply(select B.Val * 7) as C(Val)
答案 1 :(得分:8)
您不能通过稍后引用其列别名来引用刚创建的表达式。将整个选择列表视为同时或以随机顺序实现 - 当您尝试创建表达式来创建B时,A还不存在。您需要重复表达式 - 我不认为您将能够制作“更简单”的计算列而不重复它们,并查看相同的内容 - 您必须嵌套内容,例如:
SELECT A, B, C = B * 7
FROM
(
SELECT A, B = A + 3
FROM
(
SELECT A = (1 + 2)
) AS x
) AS y;
或重复表达(但我想这就是你要避免的)。
答案 2 :(得分:5)
如果有人仍然感兴趣的另一种选择:
with aa(a) as ( select 1+2 )
, bb(b) as ( select a+3 from aa )
,cc(c) as ( select b*7 from bb)
SELECT aa.a, bb.b, cc.c
from aa,bb,cc
答案 3 :(得分:1)
“保存”计算结果的唯一方法是在子查询中使用它们,这样就可以使用A, B and C
。不幸的是,它不能以任何其他方式完成。
答案 4 :(得分:1)
您可以创建computed columns来表示您想要的值。此外,如果您的计算取决于单独表格中的数据,则可以使用view。
答案 5 :(得分:0)
您想要从表中计算出结果吗?在这种情况下,您可以将相关计算放在标量值的用户定义函数中,并在select
语句中使用它。
或者您希望计算结果在表格中显示为列,然后使用计算列:
CREATE TABLE Test(
ID INT NOT NULL IDENTITY(1,1),
TimesTen AS ID * 10
)