我有3列是使用复杂子串和替换函数计算的字符串列。
我有第4列,应该是col1 + col2 + col3。
目前第4列正在重复计算col1和col2以及col3所需的计算。
select语句看起来像这样(我删除了大部分功能):
select
STR(c1, 2, 0) as col1,
STR(c2, 2, 0) as col2,
STR(c3, 2, 0) as col3,
STR(c1, 2, 0) + STR(c2, 2, 0) + STR(c3, 2, 0) as col4
from blah
问题在于我们正在重复计算列的功能,打破DRY主体并为错误提供机会。
我更愿意,如果我们可以做这样的事情:
select
STR(c1, 2, 0) as col1,
STR(c2, 2, 0) as col2,
STR(c3, 2, 0) as col3,
col1 + col2 + col3 as col4
from blah
有这样一种巧妙的方法吗?我认为可以使用临时表来完成,但这似乎有些过分。
值得做,还是我只是认真对待DRY。
答案 0 :(得分:3)
您可以使用CTE执行此操作:
;WITH data_cte (col1, col2, col3)
AS
(
select
STR(c1, 2, 0) as col1,
STR(c2, 2, 0) as col2,
STR(c3, 2, 0) as col3
from blah
)
SELECT
col1, col2, col3,
col1 + col2 + col3 as col4
FROM data_cte
答案 1 :(得分:2)
你可以这样做(抱歉格式化):
select i.col1, i.col2, i.col3, i.col1 + i.col2 + i.col3 as col4
from (
select
STR(c1, 2, 0) as col1,
STR(c2, 2, 0) as col2,
STR(c3, 2, 0) as col3,
from blah ) i
答案 2 :(得分:0)
这是另一种解决方案(但我承认,我更喜欢DavidG&#CTE方法(+1来自我方)。
只是为了表明,您需要某种子选择来为您提供可以使用的列名称:
SELECT col1,col2,col3,col4
FROM
(
SELECT STR(c1, 2, 0) as col1,
STR(c2, 2, 0) as col2,
STR(c3, 2, 0) as col3
FROM @tbl
) AS tbl
CROSS APPLY(SELECT col1 + col2 + col3) as ThisIs(col4)