我正在尝试从包含多个注释的字符串中提取数据,这些注释附加到varchar(4000)列中。我在查询中混合使用了正则表达式和功能,以及使用regexp_count的CONNECT BY LEVEL,因为我不知道会出现一个注释还是多个注释。当我返回结果时,我注意到有很多重复的行。我相信这完全是由于CONNECT BY造成的,这不是我以前必须使用的东西,所以我想我错过了一些东西。
这是查询;
select
id,
substr(regexp_substr(VALUE,'^LOCKED BY USER: +(.*)',1,level,'m'),17) as LOCKUSER,
substr(regexp_substr(VALUE,'^LOCKED ENTITY: +(.*)',1,level,'m'),16) as LOCKED_ENTITY,
TO_DATE(LTRIM(regexp_substr(VALUE,'^LOCKED AT: ([[:digit:]]{2}/[[:digit:]]{2}/[[:digit:]]{4}\.?)',1,level,'m'),'LOCKED AT: '),'DD/MM/YYYY') as Dates_Locked,
substr(regexp_substr(VALUE,'^LOCK NOTES: +(.*)',1,level,'m'),13) as LOCK_NOTES,
'LOCK' as ACTION
from TABLE
where regexp_substr(VALUE,'^LOCK NOTES: +(.*)',1,level,'m') IS NOT NULL
AND TO_DATE(LTRIM(regexp_substr(VALUE,'LOCKED AT: ([[:digit:]]{2}/[[:digit:]]{2}/[[:digit:]]{4}\.?)',1,level,'m'),'LOCKED AT: '),'DD/MM/YYYY') >= (SYSDATE -365)
connect by level <= regexp_count(VALUE,CHR(10)||CHR(13));
如果我让它对具有10K条记录的表运行,则我永远都不会得到任何结果,我认为这是由于返回的重复行数量巨大。我有办法防止这种情况吗?
非常感谢
答案 0 :(得分:2)
当前,您的CONNECT BY
仅限制层次结构级别,并且不提供将子行与父行匹配的任何条件。这意味着在具有多行的表中,每行都是其他行的子级。这将产生大量结果集。
如果我理解正确,那么您正在尝试使用分层功能从每一行中提取多个值。因此,您真的希望每一行都是自己的父母。我建议尝试:
CONNECT BY id = PRIOR id
AND prior sys_guid() is not null
AND level <= regexp_count(VALUE,CHR(10)||CHR(13))
感谢@kfinity指出需要sys_guid()来防止CONNECT BY LOOP。