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

Oracle字符串拆分时出现重复值问题求助

错误原因

你的查询使用connect by递归拆分字符串时,未限定递归仅在当前行范围内执行。Oracle的递归查询会默认关联所有符合条件的行,导致同一用户的递归结果被重复关联,生成多余的重复记录(比如Bob的CR、DE各多出现一次)。

修复方案

方案一:兼容所有Oracle版本

在connect by子句中添加两个条件,限制递归仅在当前用户的行内进行,同时避免循环递归:

with rws as (
  select 'Bob' person, 'AB,CR,DE' str from dual UNION ALL 
  select 'Jane' person, 'AB' str from dual 
)
select person,
       regexp_substr (
           str,
           '[^,]+',
           1,
           level
         ) value
from   rws
connect by level <= length(str) - length(replace(str, ',')) + 1
       and prior person = person
       and prior sys_guid() is not null
order by person, value;
  • prior person = person:确保递归仅针对当前用户的行展开
  • prior sys_guid() is not null:通过生成唯一GUID,避免Oracle识别为循环递归而终止执行

方案二:Oracle 12c+ 简洁写法

使用CROSS APPLY让每行独立拆分字符串,彻底避免递归交叉关联问题:

with rws as (
  select 'Bob' person, 'AB,CR,DE' str from dual UNION ALL 
  select 'Jane' person, 'AB' str from dual 
)
select r.person, t.value
from rws r
cross apply (
  select regexp_substr(r.str, '[^,]+', 1, level) value
  from dual
  connect by level <= regexp_count(r.str, '[^,]+')
) t
order by r.person, t.value;

regexp_count直接统计字符串中分隔后的元素数量,比计算长度差更直观可靠。

内容的提问来源于stack exchange,提问作者Beefstu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:00:45