sql - 我可以在同一查询中单独选择列值并作为一个连接选择列值并避免冗余代码吗?
问题描述
我有一个场景,我需要查询 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() 函数,但无济于事。
虽然这个查询确实实现了我所追求的,但我想知道我是否可以清理它或重组它以避免这种冗余代码。
解决方案
使用 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
推荐阅读
- jmeter - 如何在 JMeter 中发送 .apk 文件
- applescript - 使用 AppleScript 删除 iMessage 中的消息?
- c - 将函数数组(带参数)作为参数传递给函数
- php - 如何记录数据是否已发送到数据库
- gradle - Gradle 6.0.1 不运行我的 Junit 类。即使我在 Windows 10 中输入 gradle test 后构建成功
- artifactory - 删除后包含工件的 Jfrog 工件删除文件夹
- r - 如何根据 R 中另一列的值的总和绘制一列的因子?
- reactjs - 基于本地存储断言组件行为的更好方法
- node.js - 猫鼬中的connectTimeoutMS不起作用
- r - 根据 r 中的函数计算每一行