1

假设我有一个 2 列的表,在第 1 列。是一个帐号,在第二个个人客户 ID 中,但在一个长字符串中。在该字符串中可能有几个不同的客户端 ID,每个都以“ID”开头

|account_no  | note
|12345       | AAAAID1111BBBBID2222CCACAID3333JDBSTGDid4444

我怎样才能在单行中收到这样的结果?:

account_no|ID
12345      1111
12345      2222
...
1234       4444

使用regexp_substr(upper(note), 'ID[[:digit:]]{4}')它只返回整个字符串中的第一个 ID。

任何循环或正则表达式有什么技巧吗?

4

1 回答 1

1

使用 CONNECT BY 遍历字符串,查找不区分大小写的字母 'ID' 后跟 1 个或多个数字(可选地后跟行尾)的匹配项,以便捕获最后一个。找到后,获取第二组,即匹配的数字部分,用括号括起来。

with tbl(account_no, note) as (
  select 12345, 'AAAAID1111BBBBID2222CCACAID3333JDBSTGDid4444' from dual
)
select account_no, 
       regexp_substr(note, '(ID(\d+))$?', 1, level, 'i', 2) ID
from tbl
connect by level <= regexp_count(note, 'ID\d+', 1, 'i');
于 2017-09-13T19:25:32.250 回答