如何在SQL Server上的CASE WHEN中选择多个列?

时间:2010-01-15 15:34:57

标签: sql-server select case-when

我已经广泛搜索过该网站,但无法找到解决方案。

以下是我的查询示例:

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”,但我想要问......

4 个答案:

答案 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语句并使用拆分逻辑从连接的结果集中进行选择。