2015-11-23 61 views
2

我有3列是使用复杂子字符串和替换函数计算的字符串列。在SQL中连接计算的字段

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

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

回答

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

你可以用一个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 
+0

谢谢,+1是一个好主意,我选择了皮特斯只是因为我认为它更紧凑。 –

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) 
+0

感谢您的回应,我认为这样做更简洁,交叉申请的目的是什么,我曾与皮特的答案玩过,哪个有效,是否需要交叉申请? –

+1

@DesHorsley,不,不是:-)这只是一种方式来获取所有列中的子选择计算的列。只是想展示一些方法来处理具有“口语名称”的计算列。我最喜欢的是CTE ...... – Shnugo