Oracle SQL:提取首个大括号内文本的实现方法求助
提取字符串中每组首个大括号内的内容(纯SQL方案)
嘿,我懂你想要的效果——从类似{ABCDE}{F1} {GHIJ}{K12}这样的字符串里,把每一组里第一个大括号里的内容(比如ABCDE、GHIJ)提取出来,而且不想用自定义函数或者PL/SQL对吧?这有个纯SQL的方案,不用额外写函数就能搞定:
方案1:将提取结果拆分为单独行
假设你的字符串字段名为input_str,表名为your_table,可以用正则结合分层查询来逐个提取目标内容:
WITH sample_data AS ( -- 这里替换成你的实际表和字段 SELECT '{ABCDE}{F1} {GHIJ}{K12}' AS input_str FROM dual ) SELECT REGEXP_SUBSTR(input_str, '\{([^}]+)\}[^{]+', 1, LEVEL, 'i', 1) AS extracted_value FROM sample_data CONNECT BY REGEXP_SUBSTR(input_str, '\{([^}]+)\}[^{]+', 1, LEVEL) IS NOT NULL;
正则逻辑说明:
\{([^}]+)\}:匹配以{开头的内容,捕获{和}之间所有非}的字符(这就是我们要提取的核心内容)[^{]+:匹配第一个大括号之后、下一个大括号之前的所有内容(包括第二个大括号和空格等分隔符)LEVEL:用来循环遍历字符串中所有符合规则的分组,逐个提取每一组的目标内容
执行后你会得到两行结果:
ABCDE GHIJ
方案2:将提取结果合并为单个字符串
如果希望把所有提取的内容用分隔符(比如逗号)连在一起,可以搭配LISTAGG函数:
WITH sample_data AS ( SELECT '{ABCDE}{F1} {GHIJ}{K12}' AS input_str FROM dual ) SELECT LISTAGG(REGEXP_SUBSTR(input_str, '\{([^}]+)\}[^{]+', 1, LEVEL, 'i', 1), ', ') AS extracted_values FROM sample_data CONNECT BY REGEXP_SUBSTR(input_str, '\{([^}]+)\}[^{]+', 1, LEVEL) IS NOT NULL GROUP BY input_str;
执行后结果会是:
ABCDE, GHIJ
这个方案完全基于原生SQL实现,不需要编写任何自定义函数或PL/SQL块,适配Oracle这类支持正则表达式和分层查询的数据库。
内容的提问来源于stack exchange,提问作者Anish
相关产品推荐
相关产品推荐

