oracle regex函数格式化我们的电话号码

时间:2018-08-24 02:07:22

标签: sql oracle

我正在尝试使用Oracle正则表达式来格式化我们的电话号码。

我必须使用以下条件

  1. 如果位数<10,则为空
  2. 如果数字位数= 10,则将电话号码格式设置为111-111-1111
  3. 如果数字位数> 10并且在前面带有加号,则格式化  跳过加号后的第一个数字为111-111-1111
  4. 如果数字位数> 10并且在前面没有加号,则将前10位数字格式设置为111-111-1111

请参阅以下所有4种情况的示例

+(555)                     --> NULL
1112223333                 --> 111-222-3333
+1 (123) 1111111 x1111     --> 123-111-1111
(111)1111111 Ext. 1111     --> 111-111-1111
(111) 111-1111 ext 1111    --> 111-111-1111                 
2 111-111-1111             --> 211-111-1111

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

最简单的方法(不使用正则表达式):

  1. translate()去除非数字字符
  2. substr()减少到十位数
  3. substr()重新格式化

所以:

 with cte as 
    ( select substr ( 
                translate ( phone
                            , '1234567890' || phone
                            , '1234567890' 
                    ) , 1, 10 ) as clean_phone 
      from your_table 
    )
 select  case 
             when length(clean_phone) = 10 then
                 substr(clean_phone, 1, 3)
                 ||'-'||
                 substr(clean_phone, 4, 4)
                 ||'-'||
                 substr(clean_phone, 7, 4)
             else null end as fmt_phone
 from cte

帽子到@mathguy for the translate() implementation的提示。

答案 1 :(得分:0)

我使用了嵌套SQL。 在最内部的步骤中,尝试使用regexp_replacesubstr来消除加号后的数字和所有非数字字符,

,然后使用format model作为 to_char 函数的参数转换为所需的格式,如下所示:

select (case when length(str_)<10 then null
         else
         replace(to_char(substr(str_,1,10),'fm999,999,9999'),',','-')
         end)
         as str
    from 
     (
      select (case when substr(str,1,1)='+' then
              regexp_replace(substr(str,3,length(str)),'[^0-9]','')
              else
              regexp_replace(str,'[^0-9]','') 
              end) as str_
       from tab
     );

SQL Fiddle Demo

答案 2 :(得分:0)

REGEXP_REPLACE(phone,'^(+?1[.[:space:]-])?(?(\d{3})(\d*).*','\2-\3')