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