连接 SQL 中的计算字段

Concatenate calculated fields in SQL

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

有没有一种巧妙的方法可以做到这一点?我认为可以使用临时 table 来完成,但这似乎有点过头了。

它值得做吗,还是我只是认真对待 DRY。

您可以使用 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

这是另一种解决方案(但我承认,我更喜欢 DavidG 的 CTE 方法(我这边 +1)。

只是为了表明,您需要某种子 select 来为您提供可以使用的列名称:

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)

你可以这样做(抱歉格式化):

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