-2

可能重复:
将访问代码转换为 SQL

我有一个使用IIF具有 2 合 1 的语句的访问代码,我正在尝试将它们重写为 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 格式

4

2 回答 2

2

您可以简化 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 中(也就是说,我有点希望没有人使用它)。

于 2013-01-21T21:59:29.027 回答
1
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 函数,但它显然 不是很 好玩。如果您得到奇怪的结果,请查看其他一些现有的解决方法。不过,根据您的数据,您可能会没事。

于 2013-01-21T21:25:08.800 回答