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
相关产品推荐
相关产品推荐

