首页 > 解决方案 > 我可以在同一查询中单独选择列值并作为一个连接选择列值并避免冗余代码吗?

问题描述

我有一个场景,我需要查询 SSRS 报告的值,并以各自的状态显示它们一次,然后将它们全部连接在一起。为了避免将来对 SSRS 报告进行更改,我希望在查询中完成连接。但是,我当前的查询有很多冗余代码,因为我重复了对 CONCAT() 函数内的每一列执行的操作:

SELECT
    CASE
        WHEN a.TwoPartColumn LIKE '%-%'
        THEN LEFT(a.TwoPartColumn, CHARINDEX('-', a.TwoPartColumn) - 1)
        ELSE a.TwoPartColumn
    END AS FirstPart,
    CASE
        WHEN a.TwoPartColumn LIKE '%-%'
        THEN RIGHT(a.TwoPartColumn, LEN(a.TwoPartColumn) - CHARINDEX('-', a.TwoPartColumn))
        ELSE '001'
    END AS SecondPart,
    LEFT(rtrim(b.RightPadThis) + '0000000000', 10) AS RightPadded,
    RIGHT('00000000'+ rtrim(b.LeftPadThis,0), 8) AS LeftPadded,
    b.Units AS Units,
    CONCAT
    (
        CASE
            WHEN a.TwoPartColumn LIKE '%-%'
            THEN LEFT(a.TwoPartColumn, CHARINDEX('-', a.TwoPartColumn) - 1)
            ELSE a.TwoPartColumn
        END,
        CASE
            WHEN a.TwoPartColumn LIKE '%-%'
            THEN RIGHT(a.TwoPartColumn, LEN(a.TwoPartColumn) - CHARINDEX('-', a.TwoPartColumn))
            ELSE '001'
        END,
        LEFT(rtrim(b.ItemCd) + '0000000000', 10),
        RIGHT('00000000'+ rtrim(b.LeftPadThis,0))), 8),
        b.Units
    ) AS Concatenated
FROM TableA AS a
JOIN TableB AS b ON b.Id = a.Id
WHERE b.Param = @Param

作为一个 SQL 新手,我尝试将列的别名传递给 CONCAT() 函数,但无济于事。

虽然这个查询确实实现了我所追求的,但我想知道我是否可以清理它或重组它以避免这种冗余代码。

标签: sqlsql-serverselectconcatenation

解决方案


使用 CTE 是处理此类事情的最简单方法。像这样的东西。

with MyData as
(
    SELECT
        CASE
            WHEN a.TwoPartColumn LIKE '%-%'
            THEN LEFT(a.TwoPartColumn, CHARINDEX('-', a.TwoPartColumn) - 1)
            ELSE a.TwoPartColumn
        END AS FirstPart,
        CASE
            WHEN a.TwoPartColumn LIKE '%-%'
            THEN RIGHT(a.TwoPartColumn, LEN(a.TwoPartColumn) - CHARINDEX('-', a.TwoPartColumn))
            ELSE '001'
        END AS SecondPart,
        LEFT(rtrim(b.RightPadThis) + '0000000000', 10) AS RightPadded,
        RIGHT('00000000'+ rtrim(b.LeftPadThis,0), 8) AS LeftPadded,
        b.Units AS Units
    FROM TableA AS a
    JOIN TableB AS b ON b.Id = a.Id
    WHERE b.Param = @Param
)
select FirstPart
    , SecondPart
    , RightPadded
    , LeftPadded
    , Units
    , concat(FirstPart, SecondPart, RightPadded, LeftPadded, Units)
from MyData

推荐阅读