【问题标题】:Oracle get all matched occurrences from one column with REGEXPOracle 使用 REGEXP 从一列中获取所有匹配项
【发布时间】:2021-11-19 21:55:55
【问题描述】:

一直在使用这个查询,但我没有得到我想要的,有人可以帮忙吗?我想合并所有匹配的多次出现并在表中显示记录。

SELECT REGEXP_SUBSTR(STR,'^C-.+|^WHT.+',1, LEVEL,1,'m') AS CHARGE_NUMBER
FROM
(
  SELECT DBMS_LOB.SUBSTR(COL_DATA, 2000,1) AS STR, TRANX_DATE, USER_ID
  FROM  TABLE_1 
)
CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(STR,'^C-.+|^WHT.+',1,1,'m'))+1

一列中的数据

A-DATE|27SEP2021|TRANSACTION_NUMBER|0001|USERID|1000
B-THE|QUICK|BROWN|123467899|OVER|THE|1234567899|DOG
C-50000000001
WHT639281234567
B-THE|123456789|BROWN|FOX|OVER|THE|LAZY|DOG
C-50000000002
WHT639281234568
B-THE|1234567899|BROWN|123457899|OVER|THE|LAZY|DOG
C-50000000003
B-THE|QUICK|BROWN|1234567899|OVER|1234567899|LAZY|DOG
WHT639281234569
B-THE|QUICK|BROWN|FOX|OVER|THE|LAZY|DOG
C-50000000004
WHT639281234570
B-THE|1234567899|BROWN|123467899|OVER|THE|1234567899|DOG

期望的结果:

CHARGE_NUMBER                           
50000000001
639281234567   
50000000002
639281234568
50000000003   
639281234569
50000000004
639281234570

【问题讨论】:

  • 请描述规则。应该从哪些记录中捕获什么以及为什么提供的答案不起作用(如此糟糕的短语,完全没有提供任何信息)

标签: sql regex oracle


【解决方案1】:

这里有一个选项:选择您需要的值(使用正则表达式),然后删除多余的字符(C-WHT),循环字符串的次数与 WHT 一样多s times 2(因为您要查找 C-WHTs)。

SQL> with test (col) as
  2    (select 'A-DATE|27SEP2021|TRANSACTION_NUMBER|0001|USERID|1000
  3  B-THE|QUICK|BROWN|FOX|OVER|THE|LAZY|DOG
  4  C-50000000001
  5  WHT639281234567
  6  B-THE|QUICK|BROWN|FOX|OVER|THE|LAZY|DOG
  7  C-50000000002
  8  WHT639281234568
  9  B-THE|QUICK|BROWN|FOX|OVER|THE|LAZY|DOG
 10  C-50000000003
 11  B-THE|QUICK|BROWN|FOX|OVER|THE|LAZY|DOG
 12  WHT639281234569
 13  B-THE|QUICK|BROWN|FOX|OVER|THE|LAZY|DOG
 14  C-50000000004
 15  WHT639281234570
 16  B-THE|QUICK|BROWN|FOX|OVER|THE|LAZY|DOG' from dual
 17  )
 18  select replace(replace(regexp_substr(col, 'C-\d+|WHT\d+', 1, level), 'C-', ''), 'WHT', '') charge_number
 19  from test
 20  connect by level <= regexp_count(col, 'WHT') * 2;

CHARGE_NUMBER
--------------------------------------------------------------------------------
50000000001
639281234567
50000000002
639281234568
50000000003
639281234569
50000000004
639281234570

8 rows selected.

SQL>

【讨论】:

  • 嗨@Littlefoot,谢谢你的回答,我试过查询它不起作用。顺便说一句,有时 C- 存在/不存在或 WHT 存在/不存在,但有时两者都存在......
  • 嗨@Littlefoot 我的错。从技术上讲,它可以工作,但是如果我要删除一个 C-50000000002 和 C-50000000004,则根本不会显示剩余的匹配项。
猜你喜欢
  • 2019-01-30
  • 1970-01-01
  • 2011-08-15
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多