我有一个表 my_table ,其中有一列 source_column ,它是由 " ; " 连接的字符串串联。它出现一次或多次模式 UID-xxxx(子字符串 UID-:
之后恰好有四个字母数字字符)my_table:
source_column
--------------------------------------------
UID-12AB ; blah blah ; UID-CD34 ; blah blah
UID-56EF ; blah blah
UID-GH78 ; UID-90IJ ; UID-KL12 ; blah blah ; UID-34MN ; blah blah
我想要做的是提取并列出(逗号分隔)xxxx部分,并删除UID-。那里可能存在不相关的字符,也应该被丢弃。像这样的东西:
my_result_table:
source_column extracted_column
-------------------------------------------- -----------------------
UID-12AB ; blah blah ; UID-CD34 ; blah blah 12AB, CD34
UID-56EF ; blah blah 56EF
UID-GH78 ; UID-90IJ ; UID-KL12 ; blah blah ; UID-34MN ; blah blah GH78, 90IJ, KL12, 34MN
我尝试了一些regexp_replace的变体,但没有得到我真正想要的。
知道如何实现这样的事情吗?
技巧是将 Oracle 的 REGEXP_SUBSTR 与 LISTAGG 结合使用,从 source_column 中提取并聚合模式 UID-xxxx 的匹配项。
WITH extracted_matches AS (
SELECT
source_column,
REGEXP_SUBSTR(source_column, 'UID-([A-Z0-9]{4})', 1, LEVEL, NULL, 1) AS extracted_part
FROM my_table
CONNECT BY REGEXP_SUBSTR(source_column, 'UID-([A-Z0-9]{4})', 1, LEVEL) IS NOT NULL
AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
AND PRIOR source_column = source_column
)
SELECT
source_column,
LISTAGG(extracted_part, ', ') WITHIN GROUP (ORDER BY extracted_part) AS extracted_column
FROM extracted_matches
GROUP BY source_column;
此查询有效地提取所需结果并将其格式化到新列extracted_column