30

我已经广泛搜索了这个网站,但找不到解决方案。

这是我的查询示例:

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)

显然我遗漏了很多查询,我只是想看看它是否可能。

我知道我可能只能做两次“案例”,但我想我会问......

4

4 回答 4

34

问题是该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
于 2010-01-15T15:41:06.110 回答
15

不,CASE是一个函数,并且只能返回一个值。我认为您将不得不复制您的 CASE 逻辑。

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

于 2010-01-15T15:39:10.297 回答
3

"Case" 只能返回单个值,但您可以使用复杂类型:

create type foo as (a int, b text);
select (case 1 when 1 then (1,'qq')::foo else (2,'ww')::foo end).*;
于 2016-11-22T08:21:12.663 回答
2

其实你可以做到。

虽然,有人应该注意到重复这些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

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

于 2017-08-07T10:45:23.067 回答