首页 > 解决方案 > 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 因为我需要进行一些连接并依赖来自多个表的数据。有没有办法以我想要的方式编写案例?

标签: sql-servertsqlcase

解决方案


一个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.


推荐阅读