如何用REGEXP_SUBSTR替代REGEXP_SPLIT_TO_ARRAY实现Oracle非工作日过滤
解决Oracle中替代PostgreSQL REGEXP_SPLIT_TO_ARRAY的非工作日过滤问题
原PostgreSQL查询通过REGEXP_SPLIT_TO_ARRAY将逗号分隔的non_working_days拆分为数组,再判断#{DAY}是否不在数组中。Oracle不支持该函数,这里提供两种基于REGEXP_SUBSTR的等价实现:
方法1:拆分字符串+NOT EXISTS判断
利用REGEXP_SUBSTR结合递归查询拆分逗号分隔的字符串,再通过NOT EXISTS筛选目标数据:
SELECT * FROM department d WHERE dept_status = 'A' AND dept_loc = 'US' AND NOT EXISTS ( SELECT 1 FROM ( SELECT REGEXP_SUBSTR(LOWER(d.non_working_days), '[^,]+', 1, LEVEL) AS day_val FROM dual CONNECT BY REGEXP_SUBSTR(LOWER(d.non_working_days), '[^,]+', 1, LEVEL) IS NOT NULL ) t WHERE t.day_val = LOWER(#{DAY}) )
方法2:正则匹配简化判断
如果不需要显式拆分字符串,可直接用REGEXP_LIKE检查#{DAY}是否存在于逗号分隔列表中,逻辑更简洁:
SELECT * FROM department WHERE dept_status = 'A' AND dept_loc = 'US' AND NOT REGEXP_LIKE(LOWER(non_working_days), '(^|,)' || LOWER(#{DAY}) || '(,|$)')
说明
- 两种方法都对
non_working_days和#{DAY}做了小写转换,与原逻辑保持一致 - 方法2的正则表达式
(^|,)和(,|$)用于匹配列表的开头/结尾或分隔符,避免部分匹配(比如防止把mon误判为monday的一部分)
内容的提问来源于stack exchange,提问作者user19471184
相关产品推荐
相关产品推荐

