【问题标题】:Using CASE Statement inside IN Clause在 IN 子句中使用 CASE 语句
【发布时间】:2014-06-19 20:21:24
【问题描述】:

是否可以在 IN 子句中使用 CASE 语句?

这是我一直试图正确编译的简化版本:

SELECT * FROM MyTable 
WHERE StatusID IN (
CASE WHEN @StatusID = 99 THEN (5, 11, 13)
ELSE (@StatusID) END )

谢谢!

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql


    【解决方案1】:

    CASE 只返回一个标量值。您可以改为这样做。 (根据您的示例,我假设当@StatusID = 99 时,StatusID 值 99 不匹配。)

    select *
    from MyTable
    where (@StatusID = 99 and StatusID in (5, 11, 13))
        or (@StatusID <> 99 and StatusID = @StatusID)
    

    【讨论】:

    • @LittleBobbyTables 有了你的名字,我相信你可以在后端更改它:)
    【解决方案2】:

    没有。相反,你可以把它放在外面

    SELECT *
    FROM MyTable
    WHERE 1 = (CASE WHEN @StatusID = 99 and StatusId in (5, 11, 13) then 1
                    WHEN coalesce(@StatusId, 0) <> 99 and StatusId in (@StatusID) then 1
                    ELSE 0
               END)
    

    你也可以不用case语句来写这个。

    另一个选项是动态 SQL,您实际上使用 SQL 语句创建一个字符串,然后执行它。但是,在这种情况下,动态 SQL 似乎有点过头了。

    【讨论】:

    • 看了别人的批处理语句后,我一直在想这个语法,现在我知道为什么要使用它了。很好的提示,谢谢,@gordon-linoff
    【解决方案3】:

    我想我会尝试使用表值构造函数进行不同的尝试 - 在以下情况下不允许 TVC 吗?

    SELECT * 
    FROM MyTable  
    WHERE StatusID IN 
       ( 
       SELECT 
           CASE 
             WHEN @StatusID = 99 THEN (values(5),(11),(13)) t(StatusID )
             ELSE @StatusID 
       END  
       ) 
    

    【讨论】:

      【解决方案4】:

      您可以使用 TVC 做到这一点,但方法略有不同。它没有用例,但在有许多可能的选项可供选择的情况下,它会更好地扩展:

      SELECT * 
      FROM MyTable  
      join (values 
            (99,5),(99,11),(99,13),
            (@StatusID , @StatusID)    
          ) t(k,v) on t.k= @StatusID and t.v = StatusID)
      

      或者如果你需要 where 子句中的所有内容,那么:

      SELECT * 
      FROM MyTable  
      WHERE exists (
          select 1
          from (values 
            (99,5),(99,11),(99,13),
            (@StatusID , @StatusID)    
          ) t(k,v)
          where t.k= @StatusID and t.v = StatusID)
      

      【讨论】:

        猜你喜欢
        • 2013-10-16
        • 2014-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-14
        • 2013-10-03
        相关资源
        最近更新 更多