具有多个/嵌入式CASE的SQL查询

时间:2018-03-14 18:37:17

标签: sql-server-2012 qsqlquery

我陷入了疑问;如果你有时间可以让我知道如何解决它?

我有一个(假设的)表,其中包含TypeID,SubTypeID,Option1,Option2和Option3列;最后三列是布尔值。

所以,我可能会有这样的事情:

TypeID   SubTypeID       Option1       Option2       Option3
1        5               false         false         false
2        0               true          false         false
2        0               false         true          true              
2        0               true          true          true

我想要得到的是,如果TypeID = 2,则使用以上示例:

'Option 1'
'Option 2, Option 3'
'Option1, Option 2, Option 3'

我试过这个但是语法错误,我甚至不确定它是否正确:

case when fd.TypeID=1 then ft.SubType else (case when fd.Option1=1 then 'Option 1,' else (case when fd.Option2=1 then 'Option 2,' else (case when fd.Option3=1 then 'Option 3' else '' ))) as SubType,

2 个答案:

答案 0 :(得分:0)

您可以使用IIF/CASE

SELECT 
  IIF(Option1='true', 'Option 1,', '') +
  IIF(Option2='true', 'Option 2,', '') +
  IIF(Option3='true', 'Option 3,', '') AS Output
FROM table_name
WHERE TypeId = 2;

如果您不喜欢最后一个逗号,可以将其删除:

WITH cte AS (
SELECT 
      IIF(Option1='true', 'Option 1,', '') +
      IIF(Option2='true', 'Option 2,', '') +
      IIF(Option3='true', 'Option 3,', '') AS Output
    FROM table_name
    WHERE TypeId = 2
)
SELECT LEFT(Output, len(Output)-1)
FROM cte
WHERE Output <> '';

修改

  

我如何将其封装在CASE中?类似于:CASE WHEN TypeId = 1那么ELSE(您的陈述)?当我尝试它时,我得到了一堆语法错误。

简单地:

SELECT 
  CASE WHEN Option1='true' THEN 'Option 1,' ELSE '' END +
  CASE WHEN Option2='true' THEN 'Option 2,' ELSE '' END +
  CASE WHEN Option3='true' THEN 'Option 3,' ELSE '' END AS Output
FROM table_name
WHERE TypeId = 2;

答案 1 :(得分:0)

如果你想要中间没有逗号的选项,那么我认为最简单的方法是:

select stuff( ((case when option1 = 'true' then ', Option1' else '' end) +
               (case when option2 = 'true' then ', Option2' else '' end) +
               (case when option3 = 'true' then ', Option3' else '' end)
              ), 1, 2, ''
             ) as option_list              
from t;

如果您只想要其中一种类型:

select (case when type = 1
             then select stuff( ((case when option1 = 'true' then ', Option1' else '' end) +
                                 (case when option2 = 'true' then ', Option2' else '' end) +
                                 (case when option3 = 'true' then ', Option3' else '' end)
                                ), 1, 2, ''
                              )
        end) as option_list              
    from t;