如何正确使用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 语句。
如何使用 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 语句。