【问题标题】:SQL(DB2) WHERE clause optimizationSQL(DB2) WHERE 子句优化
【发布时间】:2011-08-04 02:18:07
【问题描述】:

我将大量产品列表收集到一个数组中,该数组按行和项目命名唯一产品。然后我将它提供给我的 SQL 语句的 WHERE 子句。当这个产品列表变得相当大时,我的 WHERE 子句也会扩展到一个丑陋的混乱。下面是我的 WHERE 子句的示例:

 WHERE FOO = 'Y'
 AND ((iline = ? AND iitem = ? )
 OR (iline = ? AND iitem = ? ) 
 OR ... 
 OR (iline = ? AND iitem = ? ))

以此类推,其中每个“iline = ? AND iiitem = ?”是独一无二的产品。很明显我不是这方面的专家,但在我的 WHERE 子句中偶尔使用 100 多个 OR 似乎效率不高,我可以以某种方式做得更好。

谢谢。

【问题讨论】:

    标签: sql db2 where-clause


    【解决方案1】:

    你可以这样使用:

    Presuming, iline has values like A,B,C,D,E.... and iitem posses 1,2,3,4,5... Now, you need combinations to be satisfied like 
    (iline = 'A' AND iitem = '2'), 
    (iline = 'E' AND iitem = '2'), 
    (iline = 'B' AND iitem = '3'), 
    (iline = 'A' AND iitem = '3'), 
    (iline = 'E' AND iitem = '2'),
    (iline = 'B' AND iitem = '4')
    

    这大概可以挤到

    WHERE FOO = 'Y'
    AND (iline = 'A' and iitem IN ('2','3'))
    AND (iline = 'B' and iitem IN ('3','4'))
    AND (iline = 'E' and iitem IN ('2','3'))
    

    理想情况下,您需要添加:

    • 当你在 iline 上有一个条件时的 AND
    • 现有条件的 IN 的另一个文字。假设您必须添加新条件 (iline = 'B' and iitem = '5'),而不是添加新 OR,您可以简单地将文字 '5' 添加到现有 iline = 'B' 条件,如 (iline = 'B' and iitem IN ('3','4','5'))

    希望我已经把我的概念说清楚了,请让我知道你的问题。

    【讨论】:

    • 我同意,这比我想的要好。
    【解决方案2】:

    我怀疑它是否更有效,但您可以使用 case 语句代替:

    WHERE 
      FOO = 'Y'
      AND iline = CASE iitem
                    WHEN ? THEN ?
                    WHEN ? THEN ?
                    ...
                  END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多