在oracle中提取括号外的数据

Posted

技术标签:

【中文标题】在oracle中提取括号外的数据【英文标题】:Extract data outside of parentheses in oracle 【发布时间】:2016-01-04 06:19:09 【问题描述】:

我有这个值:(203)1669

我的要求是提取括号外的数据。

我想对这个 Oracle 查询使用正则表达式。

非常感谢!

【问题讨论】:

有什么想要得到你的愿望的尝试吗? 模式是否始终相同。我的意思是你能得到类似123(456) 嗨@Utsav 模式总是一样的。 (203)XXXX @Shikha - 好的。对于您提到的模式,请参阅此answer。我添加了trim 以防万一。如果需要,您可以将其删除。 【参考方案1】:

您可以使用Oracle REGEXP_REPLACE() 函数,匹配括号外的组。

SELECT REGEXP_REPLACE(phone_number, '\([[:digit:]]+\)(.*)', '\1') AS newValue
FROM your_table

【讨论】:

想想,你也可以试试(phone_number, '.*[^[:digit:]](.*)', '\1')【参考方案2】:

您可以使用 SUBSTR 和 INSTR 函数的组合。

select substr('(203)1669', instr('(203)1669',')')+1) from dual

【讨论】:

【参考方案3】:

此示例使用 REGEXP_SUBSTR() 并且 REGEX 明确遵循您的规范,即获取右括号和行尾之间的 4 位数字。如果位数可能不同,请将4 替换为+ 以获得一位或多位数字:

SQL> with tbl(str) as (
      select '(203)1669' from dual
    )
    select regexp_substr(str, '\)(\d4)$', 1, 1, NULL, 1) nbr
    from tbl;

NBR
----
1669

SQL>

【讨论】:

【参考方案4】:

对于您提到的模式,这应该有效。

select  
rtrim(ltrim(substr(phone_number,instr(phone_number,')')+1,length(phone_number)))) 
as derived_phone_no
from 
(select '(123)456' as phone_number from dual union all
 select '(567)99084' as phone_number from dual)

这里首先我得到)的位置,然后从)+1的位置得到substr直到字符串的长度。作为最佳实践,您可以使用修剪功能。

【讨论】:

非常感谢您提供快速解决方案!

以上是关于在oracle中提取括号外的数据的主要内容,如果未能解决你的问题,请参考以下文章

sql server 2008中列名外的中括号去除不掉

Oracle使用REGEXP_SUBSTR返回括号内的值

正则表达式提取括号中的数据

在 R [重复] 中使用 $ vs 括号 [] 从数据框中提取一列

正则表达式提取大括号之间的数据并加载到 AMQ

[SQL]导出Oracle所有表结构,除数据外的所有内容