【问题标题】:SQL CASE statement with OR?带有 OR 的 SQL CASE 语句?
【发布时间】:2014-07-09 05:47:45
【问题描述】:

说我必须关注:

Select OrderID = 
    Case OrderID 
        When 1 Then 'Customer1'
        When 2 Then 'Customer2'
        When 3 Then 'Customer2'
        Else 'Unknown Customer'
    End 
From OrdersPlaced

是否可以添加一个或并按照以下方式做一些事情:

Select OrderID = 
    Case OrderID 
        When 1 Then 'Customer1'
        When 2 Or 3 Then 'Customer2'
        Else 'Unknown Customer'
    End 
From OrdersPlaced

【问题讨论】:

  • 何不试一试?
  • @AnthonyRaymond 好吧,我显然尝试了我的确切代码并在 Or 上得到了错误。我不是在问我的代码是否可以工作,我是在问我该怎么做。

标签: sql sql-server-2008


【解决方案1】:

您可以使用其他形式的 CASE

Select OrderID = 
    Case 
        When OrderID = 1 Then 'Customer1'
        When OrderID = 2 Or OrderID = 3 Then 'Customer2'
        Else 'Unknown Customer'
    End 
From OrdersPlaced

【讨论】:

    【解决方案2】:

    CASE 表达式有两种语法 - 简单的(即您正在显示的)和搜索的,具有多个逻辑条件。如果你想使用OR,你需要第二种:

    Select OrderID = 
        Case 
            When OrderID =1 Then 'Customer1'
            When OrderID =2 Or OrderID =3 Then 'Customer2'
            Else 'Unknown Customer'
        End 
    From OrdersPlaced
    

    这是来自documentation的描述:

    • 简单 CASE 表达式将一个表达式与一组简单表达式进行比较以确定结果。
    • 搜索到的 CASE 表达式对一组布尔表达式求值以确定结果。

    【讨论】:

    【解决方案3】:

    CASE 表达式有两种形式,“搜索”和“简单”。您不能将 OR 与“简单”CASE 表达式一起使用,但您可以使用“搜索”形式:

    Case  
        When OrderID = 1 Then 'Customer1'
        When OrderID = 2 Or
             OrderID = 3 Then 'Customer2'
        Else 'Unknown Customer'
    End 
    

    甚至

    Case  
        When OrderID = 1 Then 'Customer1'
        When OrderID IN (2, 3) Then 'Customer2'
        Else 'Unknown Customer'
    End 
    

    【讨论】:

    • 但这会被优化吗?还是必须在每个案例中拉OrderID?我的过程是我使用的方法是一次抓取 OrderID,并使用该临时变量进行测试。这些方法现在是否必须为每个测试提取 OrderID?留下我的原始代码会更好吗?还是我完全错了,服务器处理所有这些都是一样的?
    • 甚至更多来自 MSDN 文档a simple CASE expression allows for only an equality check; no other comparisons are made 当您的答案似乎更多 searched CASE expression allows for values to be replaced in the result set based on comparison values 时,使用比较与相等检查会不会更慢?
    • 从您到目前为止向我们展示的结构来看,我相信在分析每个结果行时它只会“拉”一次列,无论它在SELECT 子句中出现多少次。但是,我承认我不是 SQL Server 优化方面的专家,因此可能存在一些我不知道的微妙之处。
    • @user2125348 另外,OrderID = 1OrderID IN (2, 3) 相等性检查,但是是的,搜索到的 CASE 表达式在某些情况下可能会更慢,因为它必须遍历每个WHEN 表达式直到找到匹配项,而简单的CASE 可以实现类似branch table 的东西来提高速度。在某些情况下它也可能会更快,因为您可以更严格地控​​制执行顺序。
    【解决方案4】:

    试试这个。这适用于您的方案。

    Select OrderID = 
        Case
            When OrderID  = 1 Then 'Customer1'
            When OrderID in (2, 3) Then 'Customer2'
            Else 'Unknown Customer'
        End 
    From OrdersPlaced
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 2023-02-21
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      相关资源
      最近更新 更多