我已经广泛搜索过该网站,但无法找到解决方案。
以下是我的查询示例:
SELECT
ActivityID,
Hours = (CASE
WHEN ActivityTypeID <> 2 THEN
FieldName = (Some Aggregate Sub Query),
FieldName2 = (Some other aggregate sub query)
WHEN ActivityTypeID = 2 THEN
FieldName = (Some Aggregate Sub Query with diff result),
FieldName2 = (Some Other Aggregate Sub Query with diff result)
END)
显然我遗漏了很多查询,我只是想看看是否可能。
我知道我可能只会做两次“CASE”,但我想要问......
答案 0 :(得分:28)
问题是CASE
语句不会以您尝试使用它的方式运行。您只能使用它来切换查询中一个字段的值。如果我理解你想要做什么,你可能需要这个:
SELECT
ActivityID,
FieldName = CASE
WHEN ActivityTypeID <> 2 THEN
(Some Aggregate Sub Query)
ELSE
(Some Aggregate Sub Query with diff result)
END,
FieldName2 = CASE
WHEN ActivityTypeID <> 2 THEN
(Some Aggregate Sub Query)
ELSE
(Some Aggregate Sub Query with diff result)
END
答案 1 :(得分:13)
不,CASE
是一个函数,只能返回一个值。我认为你将不得不复制你的CASE逻辑。
另一个选项是用IF包装整个查询,并有两个单独的查询来返回结果。如果没有看到剩下的查询,很难说这对你有用。
答案 2 :(得分:1)
“Case”只能返回单个值,但您可以使用复杂类型:
create type foo as (a int, b text);
select (case 1 when 1 then (1,'qq')::foo else (2,'ww')::foo end).*;
答案 3 :(得分:0)
实际上你可以做到。
虽然有人应该注意到重复CASE
语句似乎并不坏。 SQL Server的查询优化器非常智能,无法执行CASE
两次,因此您不会因此而受到任何性能影响。
此外,有人可能会使用以下逻辑来重复CASE(如果它适合您......)
INSERT INTO dbo.T1
(
Col1,
Col2,
Col3
)
SELECT
1,
SUBSTRING(MyCase.MergedColumns, 0, CHARINDEX('%', MyCase.MergedColumns)),
SUBSTRING(MyCase.MergedColumns, CHARINDEX('%', MyCase.MergedColumns) + 1, LEN(MyCase.MergedColumns) - CHARINDEX('%', MyCase.MergedColumns))
FROM
dbo.T1 t
LEFT OUTER JOIN
(
SELECT CASE WHEN 1 = 1 THEN '2%3' END MergedColumns
) AS MyCase ON 1 = 1
这将为表T1
中的每条记录插入值(1,2,3)。这使用分隔符'%'
来拆分合并的列。您可以根据需要编写自己的拆分函数(例如,处理空记录或使用varchar
字段的复杂分隔符等)。但主要的逻辑是你应该加入CASE
语句并使用拆分逻辑从连接的结果集中进行选择。