在oracle中提取正则表达式的匹配项并用逗号分隔列出它们

问题描述 投票:0回答:1

我有一个表 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的变体,但没有得到我真正想要的。

知道如何实现这样的事情吗?

sql oracle-database regexp-replace
1个回答
0
投票

技巧是将 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

© www.soinside.com 2019 - 2024. All rights reserved.