【发布时间】: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