【问题标题】:Concatenate calculated fields in SQL连接 SQL 中的计算字段
【发布时间】:2016-02-25 01:24:29
【问题描述】:

我有 3 列是使用复杂子字符串和替换函数计算的字符串列。

我有第四列,应该是 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。

【问题讨论】:

  • 要么在嵌套查询中执行计算,要么使用 CTE 方法。

标签: sql sql-server select concatenation


【解决方案1】:

您可以通过 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 好主意,我选择 Petes 只是因为我认为它更紧凑。
【解决方案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

【讨论】:

    【解决方案3】:

    这是另一种解决方案(但我承认,我更喜欢 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)
    

    【讨论】:

    • 感谢回复,我觉得这样的做法比较简洁,Cross Apply的目的是什么,我玩了pete的回答,有效果,需要cross apply吗?
    • @DesHorsley,不,不是真的:-) 这只是一种以子选择形式计算所有列的方法。只是想展示一些使用“说话名称”的计算列的方法。我最喜欢的是 CTE...
    猜你喜欢
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    相关资源
    最近更新 更多