【问题标题】:Combining CASE STATEMENTS [duplicate]结合案例陈述[重复]
【发布时间】:2013-01-21 20:43:41
【问题描述】:

可能重复:
Converting Access Code to SQL

我有一个使用具有二合一的IIF 语句的访问代码,我正在尝试将它们重写为SQL 语句为CASE 语句,但我遇到了一些减速带。

Sum(IIf([RRDD] Not Like "12*" 
    And [RRDD] Not Like "13*" 
    And [RRDD] Not Like "16*" 
    And [RRDD] Not Like "17*" 
    And [RRDD] Not Like "2706" 
    And [RRDD] Not Like "2707" 
    And [RRDD] Not Like "2331",
    CDbl([2011 Total])*IIf(IsNumeric([Dur_In_Hours]),
    CDbl([Dur_In_Hours]),0),0)) AS SP_DOM_COST

第一个 IIF 乘以第二个 IIF 是我感到困惑的地方,我需要它是 SQL 格式

【问题讨论】:

  • (CASE ... WHEN ... END) 与另一个(CASE ... WHEN ... END) 相乘并没有错,那么有什么问题呢?
  • 我不知道如何格式化SQL版本的代码,即第二个CASE WHEN部分

标签: sql sql-server ms-access case


【解决方案1】:

您可以简化 SQL Server 和 Access 中的逻辑。这是 SQL Server 版本:

Sum(case when left([RRDD], 2) not in ('12', '13', '16', '17') and
              RRDD not in ('2706', '2707', '2331') and
              isnumeric(dur_in_hours) = 1
         then [2011 Total] * cast(Dur_In_Hours as float)
         else 0.0
    end) AS SP_DOM_COST

在这两个系统中,like 将产生比搜索常量列表更多的开销。演员表是安全的,因为它在 where 子句中(我还在上面的参考资料中添加了一个答案,因为答案不正确)。

iif 的替换通常是case,虽然这个功能已经被添加到 SQL Server 2012 中(也就是说,我有点希望没有人使用它)。

【讨论】:

    【解决方案2】:
    Sum(case when [RRDD] Not Like '12%' 
    And [RRDD] Not Like '13%' 
    And [RRDD] Not Like '16%' 
    And [RRDD] Not Like '17%' 
    And [RRDD] Not Like '2706' 
    And [RRDD] Not Like '2707' 
    And [RRDD] Not Like '2331'
    then cast([2011 Total] as float) * 
        case when ISNUMERIC([Dur_In_Hours]) = 1
            then cast([Dur_In_Hours] as float) 
            else 0 
        end
    else 0 
    end) AS SP_DOM_COST
    

    虽然 IsNUmeric 是一个有效的 TSQL 函数,但它是 apparently not very nice to play with。如果您得到奇怪的结果,请查看其他一些 existing 答案以获得解决方法。不过,根据您的数据,您可能会没事。

    【讨论】:

    • 不确定,但也许*s 应该改为%s。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2010-10-30
    • 2016-05-13
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多