You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Oracle SQL中通用提取括号间的字符串?

提取字符串括号内内容的通用Oracle SQL方法

没问题,硬编码字符长度确实不够通用,这里有两种靠谱的Oracle SQL方法可以完美解决你的需求:

方法1:结合SUBSTR和INSTR计算动态长度

这种方法通过定位左右括号的位置,动态计算括号内内容的长度,完全不需要硬编码数值:

SELECT SUBSTR(
    your_column_name,
    INSTR(your_column_name, '(') + 1,
    INSTR(your_column_name, ')') - INSTR(your_column_name, '(') - 1
) AS extracted_value
FROM your_table;

原理说明:

  • INSTR(your_column_name, '('):找到左括号(在字符串中的位置
  • INSTR(your_column_name, ')'):找到右括号)的位置
  • 用右括号位置减去左括号位置再减1,得到括号内内容的精确长度,再用SUBSTR截取即可

测试你的示例字符串的话,写法如下:

SELECT SUBSTR(
    'Gupta, Abha (01792)',
    INSTR('Gupta, Abha (01792)', '(') + 1,
    INSTR('Gupta, Abha (01792)', ')') - INSTR('Gupta, Abha (01792)', '(') - 1
) AS extracted_value
FROM dual;

方法2:使用正则表达式REGEXP_SUBSTR(更简洁)

Oracle支持正则表达式,用REGEXP_SUBSTR可以一步到位提取括号内的内容:

SELECT REGEXP_SUBSTR(your_column_name, '\((.*?)\)', 1, 1, NULL, 1) AS extracted_value
FROM your_table;

正则规则说明:

  • \(:匹配左括号(因为括号是正则的特殊字符,需要用\转义)
  • (.*?):非贪婪捕获组,匹配括号内的所有字符(非贪婪模式避免匹配到多个括号时的错误)
  • 最后一个参数1:表示返回第一个捕获组的内容,也就是括号内的部分

测试示例字符串的写法:

SELECT REGEXP_SUBSTR('Gupta, Abha (01792)', '\((.*?)\)', 1, 1, NULL, 1) AS extracted_value
FROM dual;

两种方法的选择:

  • 如果你的数据库版本比较旧(Oracle 10g之前),可能不支持正则,优先用方法1
  • 如果字符串可能包含多个括号,正则方法可以通过调整第四个参数(匹配第几个括号)来灵活提取,比如REGEXP_SUBSTR(..., 1, 2, NULL, 1)可以提取第二个括号内的内容

内容的提问来源于stack exchange,提问作者Abha

火山引擎 最新活动