2013-01-21 95 views
-2

可能重複:
Converting Access Code to SQL結合CASE語句

我使用IIF語句,在1有2個接入碼,然後我試圖重寫他們的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格式

+1

把'(CASE ... WHEN ... END)'乘以另一個'(CASE ... WHEN ... END)'沒有什麼不對,那麼問題是什麼? –

+0

我不知道如何在SQL版本中格式化代碼,IE第二種情況是部分 – user1958651

回答

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功能是apparentlynot verynice to play with。如果您得到奇怪的結果,請查看其他existing解決方法的答案。根據你的數據,你可能會好起來的。

+1

不確定,但可能應將'*'s更改爲'%'s。 –

+0

你是對的!謝謝 – Brad

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中(說,我希望沒有人使用它)。