在SQL中连接计算字段

时间:2015-11-23 01:42:38

标签: sql sql-server select concatenation

我有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。

3 个答案:

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