代码之家  ›  专栏  ›  技术社区  ›  martincito

优化PL/SQL过滤器

  •  0
  • martincito  · 技术社区  · 7 年前

    我对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 != '''')
      )
      ';
    

    尤其是那些荒谬的数字。我删掉了很多,但相信我,有几百个。有没有办法使用向量或其他东西来检查变量是否匹配?

    1 回复  |  直到 7 年前
        1
  •  0
  •   GreenT    7 年前
    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;
    

    已处理对账单。

    和((processs.get_main_GC_id(nov.GCID))在( ‘01’、‘02’、‘03’、‘04’、‘05’、‘07’、‘08’、‘09’、‘10’、‘12’、‘13’、‘14’、‘16’)或 过程。get_main_GC_id(nov.GCID)为空)或 (processs.get_main_GC_id(nov.idgrupoclient)IN('23'、'29'、'40')和 额外号码!=0)或(进程。在中获取_main_GC_id(nov.idgrupoclient) ('28'、'35'、'36'、'37'、'151'、'152'、'153'))和Cortesia!='还是 (Cortesia,cortesiaGrupo,cortesiaCampania)=(('S',6,5)),calle是 非空)

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