如何重用计算列,避免重复sql语句?

时间:2011-07-28 19:52:14

标签: sql-server tsql

我有很多计算列,他们不断重复自己,一个在其他内部,包括嵌套的case语句。

我正在寻找一种方法,有一个非常简化的版本。

SELECT 
    (1+2) AS A, 
    A + 3 AS B, 
    B * 7 AS C 
FROM MYTABLE

提前致谢。

6 个答案:

答案 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
)