You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:27:57