2013-09-24 110 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