Oracle Forms预查询def_where失效:北美双条件查询返回亚洲结果
问题分析与解决方案
你遇到的问题根源在于IF-ELSIF的逻辑顺序错误,导致同时设置出发地和目的地区域时,只有出发地的过滤条件被添加,目的地的过滤完全没生效,所以结果里混进了亚洲的数据。
原代码的问题点
原代码中,IF (:FREIGHT_ESTIMATES.DSP_REGION_FROM IS NOT NULL) 是第一个判断,只要出发地区域不为空,不管目的地是否有值,都会执行这个分支,直接跳过后面的ELSIF判断——包括你写的「同时两个区域都不为空」的分支。这就导致当你同时设置北美作为出发地和目的地时,最终的def_where里只有reg_id_from的过滤条件,reg_id_to完全没被限制,自然会出现其他地区(比如亚洲)的数据。
修正方案一:调整判断顺序
把「两个区域都不为空」的判断放在最前面,这样优先处理双条件的情况,再处理单个条件:
-- 先判断双条件的情况,确保同时过滤出发地和目的地 IF (:FREIGHT_ESTIMATES.DSP_REGION_FROM IS NOT NULL) AND (:FREIGHT_ESTIMATES.DSP_REGION_TO IS NOT NULL) THEN def_where:=def_where||' reg_id_from in (select id from dss.regions where '|| ' region like '''||:freight_estimates.DSP_region_from || ''''|| ' and region_type = ''S'') and '||' reg_id_to in (select id from dss.regions where '|| ' region like '''||:freight_estimates.DSP_region_to || ''''|| ' and region_type = ''S'')'; ELSIF (:FREIGHT_ESTIMATES.DSP_REGION_FROM IS NOT NULL) THEN def_where:=def_where||' reg_id_from in (select id from dss.regions where '|| ' region like '''||:freight_estimates.DSP_region_from || ''''|| ' and region_type = ''S'')'; ELSIF (:FREIGHT_ESTIMATES.DSP_REGION_TO IS NOT NULL) THEN def_where:=def_where||' reg_id_to in (select id from dss.regions where '|| ' region like '''||:freight_estimates.DSP_region_to || ''''|| ' and region_type = ''S'')'; END IF;
修正方案二:用独立IF判断(更灵活)
如果后续可能需要添加更多过滤条件,推荐用独立的IF语句,避免互斥判断的坑。同时还能处理def_where已有内容时的连接符问题(避免开头出现多余的and):
-- 处理出发地区域过滤 IF (:FREIGHT_ESTIMATES.DSP_REGION_FROM IS NOT NULL) THEN -- 如果def_where已有条件,先加and连接 IF def_where IS NOT NULL THEN def_where := def_where || ' and '; END IF; def_where:=def_where||' reg_id_from in (select id from dss.regions where '|| ' region like '''||:freight_estimates.DSP_region_from || ''''|| ' and region_type = ''S'')'; END IF; -- 处理目的地区域过滤 IF (:FREIGHT_ESTIMATES.DSP_REGION_TO IS NOT NULL) THEN IF def_where IS NOT NULL THEN def_where := def_where || ' and '; END IF; def_where:=def_where||' reg_id_to in (select id from dss.regions where '|| ' region like '''||:freight_estimates.DSP_region_to || ''''|| ' and region_type = ''S'')'; END IF;
这种方式的好处是不用纠结判断顺序,每个条件只要不为空就会被添加到def_where里,扩展性更强。
内容的提问来源于stack exchange,提问作者Anu
相关产品推荐
相关产品推荐

