sql-server - SQL Server:在then部分中进行多个操作
问题描述
我将此案例作为更大 SQL 语句的一部分:
.
.
.
CASE
WHEN [AEC].item = 'S' THEN [sOld].code
WHEN [AEC].item= 'R' THEN [rOld].code
END AS [oldCode],
CASE
WHEN [AEC].item= 'S' THEN [sOld].system
WHEN [AEC].item= 'R' THEN [rOld].system
END AS [oldStatusSystem],
CASE
WHEN [AEC].item= 'S' THEN [sNew].code
WHEN [AEC].item= 'R' THEN [rNew].code
END AS [newCode],
CASE
WHEN [AEC].item= 'S' THEN [sNew].system
WHEN [AEC].item= 'R' THEN [rNew].system
END AS [newStatusSystem],
.
.
LEFT JOIN
tblSystemStatuses AS [sOld] ON [AEC].oldValue = [sOld].status
LEFT JOIN
tblSystemStatuses AS [sNew] ON [AEC].newValue = [sNew].status
LEFT JOIN
tblSystemRoles AS [rOld] ON [AEC].oldValue = [rOld].role
LEFT JOIN
tblSystemRoles AS [rNew] ON [AEC].newValue = [rNew].role
我希望这个案子看起来像:
CASE
WHEN [AEC].item = 'S'
THEN
[sOld].code AS [oldCode],
[sOld].system AS [oldStatusSystem],
[sNew].code AS [newCode],
[sNew].system AS [newStatusSystem]
ELSE WHEN [AEC].item = 'R'
THEN
[rOld].code AS [oldCode],
[rOld].system AS [oldStatusSystem],
[rNew].code AS [newCode],
[rNew].system AS [newStatusSystem]
END
换句话说,我想在 then 语句中执行一些操作。我无法在任何地方看到一个例子。
我不能写 if else 因为我需要进行一些连接并依赖来自多个表的数据。有没有办法以我想要的方式编写案例?
解决方案
一个case
表达式只返回一个值。所以,你不能做你想做的事。
您可以简化逻辑,但方式略有不同。可能最好的方法是使用cross apply
. 请注意,这在from
子句中,因为 中的表达式select
只能返回标量值。因此,您需要在选择中选择所需的列:
select v.oldcode, . . .
from . . . cross apply
(select v.*
from (values ('S', [sOld].code, [sOld].system, [sNew].code, [sNew].system),
('R', [rOld].code, [rOld].system, [rNew].code, [rNew].system)
) v(item, oldcode, oldsystem, newcode, newsystem)
where v.item = [AEC].item
) v
这满足了与您想要使用单个case
表达式相同的需求。值得注意的是,匹配逻辑只出现一次。此版本的优点是可以在select
.
推荐阅读
- linux - 流水线中的执行过程
- flask-wtforms - 我需要一个提示来解决这个问题
- node.js - Node.js SerialPort 循环端口检查可用端口执行 AT 命令
- c# - iText 7 PDF 可访问性:设置单元格范围
- swift - 俄罗斯轮盘赌奇怪的计数方式让我感到困惑
- wordpress - Woocommerce 未在产品详细信息页面上显示不含税的价格
- sql - 如何映射(关联)两个不相关的表而不在sql和powerbi中添加任何列
- android - Recyclerview 应该与背景重叠
- c# - 为 WMI 创建异步选择并等待它们完成
- ios - 注销后 iOS 核心数据崩溃