【问题标题】:SQL query with multiple/embedded CASE具有多个/嵌入式 CASE 的 SQL 查询
【发布时间】:2018-03-14 18:37:17
【问题描述】:

我被困在一个查询中;如果你有时间可以告诉我如何解决它吗?

我有一个(假设的)表,其中包含 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,

【问题讨论】:

    标签: sql-server-2012 qsqlquery


    【解决方案1】:

    你可以使用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 THEN 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;
    

    【讨论】:

    • 如何将它包含在 CASE 中?类似于:CASE WHEN TypeId=1 THEN ELSE(你的陈述)?当我尝试它时,我得到了一堆语法错误。
    • @NoBullMan IIF CASE 很容易理解
    【解决方案2】:

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

    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;
    

    【讨论】:

      猜你喜欢
      • 2017-10-31
      • 1970-01-01
      • 1970-01-01
      • 2022-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      相关资源
      最近更新 更多