结合案例陈述[重复]

Posted

技术标签:

【中文标题】结合案例陈述[重复]【英文标题】: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部分 【参考方案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。

以上是关于结合案例陈述[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如果某些陈述为真,则从列表中删除对象[重复]

MS Access Query 中的语法错误 [重复]

mysql中不同列的case语句[重复]

sql中的case语句对齐和清理

案例表达与案例陈述

多个案例陈述场景