2013-09-24 140 views
0

的情況下,簡化的情況下,我得到了下面的SQL代碼(SELECT語句的一部分):SQL的情況下

Case 
     When HilfsTab2.Gruppe = 'HST' And Basis.Breite_FLA = Basis.Breite Then 0 
     Else Case When HilfsTab2.Gruppe = 'SA' Or HilfsTab2.Gruppe = 'HO/TB' Or 
     HilfsTab2.Gruppe = 'PR' Then 0 Else Case 
      When HilfsTab2.Gruppe Is Null Then -1 Else 1 End End 
    End As IsHST_Fluegel 

現在,我運行這個在數百萬條目的表格。據我瞭解,SQL檢查所有行時的第一種情況,然後檢查所有行中的第二種情況,等等。這需要很長時間。現在我想,需要有一個更簡單的方法來做到這一點。

我想到的存儲過程/自定義函數,基本上輸出-1,0或1取決於條目。

在此先感謝

+0

調整高度依賴於DBMS。你正在使用哪個DBMS?甲骨文? Postgres的? –

回答

0

你的情況下,可以簡化爲:

Case 
     When HilfsTab2.Gruppe = 'HST' And Basis.Breite_FLA = Basis.Breite Then 0 
     When HilfsTab2.Gruppe in ('SA', 'HO/TB', 'PR') Then 0 
     When HilfsTab2.Gruppe Is Null Then -1 
     Else 1 
End As IsHST_Fluegel 

但這不會加快查詢。如果你想選擇數百萬行,無論如何都需要時間。

1

對於可能的速度的提高,做NULL首先檢查,最後一列比較和重構,以刪除嵌套CASE

CASE WHEN HilfsTab2.Gruppe IS NULL 
    THEN -1 
    WHEN HilfsTab2.Gruppe IN ('SA', 'HO/TB', 'PR') 
     OR (HilfsTab2.Gruppe = 'HST' AND Basis.Breite_FLA = Basis.Breite) 
    THEN 0 
    ELSE 1 
END AS IsHST_Fluegel 
+0

CASE項目的順序(應該?)無關緊要。 SQL不會(也可能不會)短路布爾表達式。我不知道是否有DBMS的工作方式不同。 –

+0

好點!我實際上並不知道這個答案 - 假設短路將會完成,並且[這個答案](http://stackoverflow.com/questions/789231/is-the-sql-where-clause-short-circuit評估#12320806)似乎表明它可能是但沒有發現任何確鑿的證據,正如你所說可能是DBMS依賴的......最簡單的方法可能只是讓@Spurious來嘗試它並報告它是否使任何區別。 –

+0

我有一個問題,如果我要創建一個程序來處理這個案例當它自己的時候,這會增加速度嗎? – Spurious