按级别进行ORACLE CONNECT产生重复的行

问题描述 投票:0回答:1

我正在尝试从包含多个注释的字符串中提取数据,这些注释附加到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条记录的表运行,则我永远都无法获得任何结果,我认为这是由于返回的重复行数量巨大。我有办法防止这种情况吗?

非常感谢

sql regex oracle connect
1个回答
1
投票

[当前,您的CONNECT BY仅限制层次结构级别,并且不提供将子行与父行匹配的任何条件。这意味着在具有多行的表中,每行都是其他行的子级。这将产生大量结果集。

如果我理解正确,您正在尝试使用分层功能从每一行中提取多个值。因此,您真的希望每一行都是自己的父母。我建议尝试:

CONNECT BY id = PRIOR id AND level <= regexp_count(VALUE,CHR(10)||CHR(13))
© www.soinside.com 2019 - 2024. All rights reserved.