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