如何正确使用SQL CASE语句

How to properly use SQL CASE statement

如何使用 CASE 语句应用到与列中特定字段对应的所有值?

例如,我希望每一列中的所有付款都显示为负数,但这仅适用于第一列。另外,我希望它适用于每一列中的所有付款。

 CASE WHEN ardoc.DocType = 'PA' 
      THEN arDoc.DocBal*(-1) ELSE ardoc.DocBal 
 END AS [Document Balance]

注意:'PA'代表付款

您不能编写将 return 多列的单个 CASE 表达式。您将需要为每一列编写一个单独的 CASE。

在这种情况下,您可以避免使用类似

的内容重复表达式
SELECT DocBal = multiplier * DocBal,
       Col2 = multiplier * Col2,
       Col3 = multiplier * Col3
FROM   arDoc
       CROSS APPLY (VALUES(IIF(DocType = 'PA', -1, 1))) V(multiplier);

正如 Tab Allerman 所说,您不能使用单个 CASE 语句来做到这一点,但可能有另一种方法。

创建一个 table(临时的或永久的)包含 DocType 和一个乘数,然后加入这个。

类似

DECLARE @t TABLE(DocType varchar(2), multiplier int)
INSERT INTO @t VALUES
('PA', -1),
('XX', 1),
('YY', 1)

然后你的查询看起来像

SELECT 
    arDoc.DocBal * ISNULL(t.Multiplier, 1) as [Document Balance],
    myNextColumn * ISNULL(t.Multiplier, 1) as [My Next Output Column]
From MyTable a
    LEFT JOIN @t t on a.DocType = t.DocType

我在这里进行了左连接并使用了 ISNULL,这样如果在@t 中没有找到任何条目,那么它会假定乘数为 1。

你仍然需要做每一列,但代码更小,如果你需要新的乘法器,你不必更改 case 语句。