You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 05:01:19