【问题标题】:Optimizing PL/SQL filter优化 PL/SQL 过滤器
【发布时间】:2018-11-02 19:08:01
【问题描述】:

我对 PL/SQL 不是很熟悉,但我在一个朋友的项目中发现了一堆代码,我觉得很不对劲,我能找到更好的替代方案吗?

SET filter_conditions = 
  '
  AND 
  (
    ((
      processes.get_main_GC_id(nov.GCID) IN ('''', ''01'',''02'',''03'',''04'',''05'',''07'',''08'',''09'',''10'',''12'',''13'',''14'',''16'')
      OR (processes.get_main_GC_id(nov.idGrupoCliente) IN (''23'', ''29'') AND ExtraNumber != 0)
      OR (processes.get_main_GC_id(nov.idGrupoCliente) IN (''28'',''35'',''36'',''37''))
      OR (processes.get_main_GC_id(nov.idGrupoCliente) IN (''40'') AND ExtraNumber != 0)
      OR (processes.get_main_GC_id(nov.idGrupoCliente) IN (''151'', ''152'', ''153''))
    ) AND Cortesia !=  ''S'')
    OR
    (Cortesia =  ''S'' AND cortesiaGrupo = 6 AND cortesiaCampania = 5 AND calle != '''')
  )
  ';

尤其是数量荒谬的 OR-IN。我编辑了很多,但相信我有数百个。有没有办法使用向量或其他东西并检查变量是否匹配?

【问题讨论】:

  • 看起来AND ExtraNumber != 0 的两个条件可以组合,其他两个processes.get_main_GC_id(nov.idGrupoCliente) IN () 列表也可以组合。 processes.get_main_GC_id() 返回什么类型?如果它是数字,您可能会丢失大量引号。同样= ''!= '' 永远不会像@GreenT 提到的那样是真的。整个事情虽然有点非结构化,所以很难看到任何真正系统的重构方式。而且它看起来像是 SQL(即查询)而不是 PL/SQL(编程语言)。

标签: optimization plsql filter


【解决方案1】:
declare
  l_filter_conditions VARCHAR2(2000) := q'{
                                            AND (
                                                 (
                                                   (processes.get_main_GC_id(nov.GCID) IN ( '01','02','03','04','05','07','08','09','10','12','13','14','16') OR processes.get_main_GC_id(nov.GCID) is NULL)
                                                OR (processes.get_main_GC_id(nov.idGrupoCliente) IN ('23', '29','40') AND ExtraNumber != 0) 
                                                OR (processes.get_main_GC_id(nov.idGrupoCliente) IN ('28','35','36','37','151','152','153')) 
                                                ) 
                                                AND Cortesia !=  'S' OR (Cortesia,cortesiaGrupo,cortesiaCampania) =  (('S',6,5)) AND calle IS NOT NULL
                                                )
                                        }';
begin
DBMS_OUTPUT.PUT_LINE(l_filter_conditions); 
end;

声明已处理。

AND ( ( (processes.get_main_GC_id(nov.GCID) IN ( '01','02','03','04','05','07','08','09','10','12','13','14','16 ') 或者 processes.get_main_GC_id(nov.GCID) 为 NULL) 或 (processes.get_main_GC_id(nov.idGrupoCliente) IN ('23', '29','40') AND ExtraNumber != 0) 或 (processes.get_main_GC_id(nov.idGrupoCliente) IN ('28','35','36','37','151','152','153')) ) AND Cortesia != 'S' OR (Cortesia,cortesiaGrupo,cortesiaCampania) = (('S',6,5)) AND calle IS 非空)

我不知道这是否能回答您的问题,但我花了一些时间重新设计您的代码。

【讨论】:

    猜你喜欢
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 2016-01-16
    相关资源
    最近更新 更多