2010-01-15 49 views
22

我已经广泛搜索该网站,但无法找到解决方案。如何在SQL Server中选择CASE中的多个列?

这里是我的查询的例子:

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

相关的问题,但不是重复是http://stackoverflow.com/q/13713316/2420536 – 2016-06-02 10:37:34

回答

26

的问题是,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 
12

没有,CASE是一个函数,而只能返回一个值。我认为你将不得不复制你的CASE逻辑。

另一种选择是用IF来包装整个查询,并有两个单独的查询返回结果。没有看到其余的查询,很难说这是否适合你。

1

“案例”只能返回一个值,但可以使用复杂类型:

create type foo as (a int, b text); 
select (case 1 when 1 then (1,'qq')::foo else (2,'ww')::foo end).*; 
+2

我认为这可能在Postgres,但不是sql-server(问题标记) – dsz 2017-03-27 01:59:54

0

其实你可以做它。

虽然,有人要注意,重复CASE声明,因为它似乎不坏。 SQL Server的查询优化器足够智能,不会执行两次,因此你不会受到任何性能影响。

此外,有人可能会使用以下逻辑不重复的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 

这将插入的值(1,2,3)表中的每个记录T1。这使用分隔符'%'来拆分合并的列。您可以根据需要编写自己的拆分函数(例如,用于处理空记录或使用varchar字段的复杂分隔符等)。但主要逻辑是您应该加入CASE语句,并使用拆分逻辑从连接的结果集中进行选择。

相关问题