【问题标题】:is there any way to separate area code from phone number in oracleoracle有什么办法可以区分电话号码和区号吗
【发布时间】:2016-04-26 01:02:34
【问题描述】:

oracle上有没有什么函数可以像参数一样给他电话号码,输出是:代码区+电话号码。

示例:

参数:+3323658568526 或 003323658568526(法国国家代码)

返回:

  • 代码区:+33
  • 电话号码:23658568526

【问题讨论】:

标签: sql oracle phone-number country-codes


【解决方案1】:

您甚至可以尝试使用正则表达式:

SELECT REGEXP_REPLACE(
                      phone,
                      '(\+|00)([0-9][0-9])([0-9]*)',
                      '+\2'
                     ) AS AREA,
       REGEXP_REPLACE(
                      phone,
                      '(\+|00)([0-9][0-9])([0-9]*)',
                      '\3'
                     ) AS PHONE
  FROM (SELECT '003323658568526' phone FROM DUAL
        UNION ALL
        SELECT '+3323658568526' phone FROM DUAL);

再次假设您的区号始终为 2 位数字。

【讨论】:

    【解决方案2】:

    您可以使用 SUBSTR

    例如,

    SQL> WITH sample_data AS(
      2  SELECT '+3323658568526' num FROM dual UNION ALL
      3  SELECT '003323658568526' num FROM dual
      4  )
      5  -- end of sample_data mimicking real table
      6  SELECT num,
      7    CASE
      8      WHEN SUBSTR(num, 1, 1) = '+'
      9      THEN SUBSTR(num, 1, 3)
     10      ELSE '+'
     11        ||ltrim(SUBSTR(num, 1, 4), '0')
     12    END area_code ,
     13    CASE
     14      WHEN SUBSTR(num, 1, 1) = '+'
     15      THEN SUBSTR(num, 4)
     16      ELSE SUBSTR(num, 5)
     17    END phone_number
     18  FROM sample_data;
    
    NUM             AREA_ PHONE_NUMBER
    --------------- ----- ------------
    +3323658568526  +33   23658568526
    003323658568526 +33   23658568526
    
    SQL>
    

    注意:区号的位数可能会有所不同,在这种情况下,您需要在 CASE 表达式中进行处理。更好的设计是将它们分开存放。您可以进一步规范化数据。

    【讨论】:

    • 谢谢拉利特,非常好的解决方案。确切地说,区号的位数因国家而异。所以我需要用 CASE 来处理这个问题,但我认为我需要更多的 CASES 来解决问题……而且我的功能更大……你如何看待包含区号的表格? ?
    • @badaoui220 如果您有一个包含区号的表格,那么您可以简单地加入这些表格。连接条件将是我的解决方案中的区号和 substr。
    • 这仅适用于国家代码有两位数的情况。但是,它可能有一位、两位或三位数字。此外,00 并不总是拨打国外电话的前缀。例如,当您从美国打电话到法国时,您必须拨打011 33 ...
    • @WernfriedDomscheit 正是我在笔记中提到的。 OP 也意识到了这一点。他在查找表中有区号,他可以加入。
    【解决方案3】:

    处理此要求的最佳方法是为区号和电话号码设置两个单独的列。这有助于提高性能 - 因为不需要执行可能对性能产生负面影响的子字符串操作。

    还有一个原因是电话号码中的位数可能会有所不同,因此可能很难找到 are 代码的结束位置(除非您使用分隔符,这又会导致子字符串操作)。

    当需要在用户界面显示数字时,可以拼接显示。

    运行诸如“我们的大多数客户来自哪个地区?”之类的查询也很有帮助。因为你可以做类似的查询

     SELECT AREA_CODE, COUNT(*) FROM TABLE GROUP BY AREA_CODE ORDER BY 2 DESC;
    

    由于地区代码没有太多不同的值,因此将其作为索引中的前导列也有助于执行索引跳过扫描和索引快速全扫描。

    【讨论】:

    • 感谢您的回答,您的设计如此清晰,逻辑上我们从头开始一个项目,但现在该项目已经存在,我们需要实现此解决方案以与 WS 通信:)
    • 然后使用子字符串并添加基于函数的索引来补偿性能。
    猜你喜欢
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 2023-03-14
    • 2013-03-07
    相关资源
    最近更新 更多