【发布时间】:2021-10-04 12:10:45
【问题描述】:
我在 Oracle 中使用 Connect by Level 查询以显示所有匹配的记录 regexp_substr 但它没有显示全部,我需要将 Connect by Level 从 +1 更改为 +8 以获得所有结果。如果未来的比赛比这更多怎么办?我想在不将 +1 更改为 +10 或 +20 等的情况下捕获多少匹配项。有没有最简单和最快的方法?
这是我的查询:
SELECT DATA_SOURCE,REGEXP_SUBSTR(DATA_SOURCE,'A-\S+|ABC\S+',1, LEVEL) AS REF_NUM
FROM
(
SELECT '
Z-TEST
Y-TEST
A-123456789
ABC123456790
Y-TRY
A-123456791
ABC123456792
ABC123456793
Y-TRY
Y-TRY
Z-TEST
Y-TEST
Z-TEST
Y-TEST
A-123456794
ABC123456795
ABC123456796
Y-TRY
Z-TEST
Y-TEST
Z-TEST
Y-TEST
A-123456797
ABC123456798
' DATA_SOURCE
FROM DUAL
)
CONNECT BY LEVEL <= LENGTH(REGEXP_COUNT(DATA_SOURCE,'A-\S+|ABC\S+'))+1
Result:
A-123456789
ABC123456790
A-123456791
Desired Result:
REF_NUM
A-123456789
ABC123456790
A-123456791
ABC123456792
ABC123456793
A-123456794
ABC123456795
ABC123456796
A-123456797
ABC123456798
【问题讨论】:
-
你为什么要比较计数的长度?如果输出中有 8 个结果,则计数为 8。8 的长度为 1。(“长度”表示数字中有多少位 - 在本例中为一位。)为什么要将任何内容与 1 进行比较,而不是 8?
-
除此之外,你确定你的正则表达式是正确的吗?如果输入包含字符串
DMA-123,它也会返回A-123,这是你需要的吗? -
嗨@mathguy,你是对的,应该修改正则表达式,我只需要那些第一个字符串'^A-|^ABC',1,1,'m' 我在Connect中尝试了多行函数按级别不起作用!有什么建议吗?