sql - ORACLE CONNECT BY LEVEL 产生重复行

标签 sql regex oracle

我正在尝试从一个字符串中提取数据,该字符串由附加到 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 条记录的表运行,我永远不会得到任何结果,我认为这是由于它返回的重复行的绝对数量。我有办法避免这种情况吗?

非常感谢

最佳答案

目前,您的CONNECT BY 只限制了层级,并没有提供任何子行与父行匹配的条件。这意味着在一个有多行的表中,每一行都是其他行的子行。这将产生大量结果集。

如果我没理解错的话,您是在尝试使用分层功能从每一行中提取多个值。所以你真的希望每一行都是自己的 parent 和 child 。我建议尝试:

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。

关于sql - ORACLE CONNECT BY LEVEL 产生重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58751283/

相关文章:

Java 正则表达式。为什么这是错误的(Eclipse 表达式调试器)

javascript - 从具有特定字符的字符串中提取子字符串

android - 缺少 JDBC 驱动程序 oracle 10g android 4.x

oracle - 勺子 : import data from Oracle

oracle - ORA-01031: 通过 dblink 插入时权限不足

php - 在 php 中插入值

mysql - 如何用以前的非空值替换空值?

sql - 如何对 SQL 选择执行 boolean 加法

sql - 如何查找geom数据类型中不同表中两列之间的距离

java - 在java中使用正则表达式替换两个不同的字符