是否有任何方法可以将区域代码与oracle中的电话号码分开

时间:2016-01-20 09:08:56

标签: sql oracle phone-number country-codes

oracle上有什么功能可以给他一个参数的电话号码,输出是:代码区+电话号码。

例如:

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

返回:

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

3 个答案:

答案 0 :(得分:1)

您可以使用 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 表达式中处理它。更好的设计是将它们分开存放。您可以进一步规范化数据。

答案 1 :(得分:0)

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

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

当您需要在用户界面中显示数字时,您可以连接并显示。

还可以运行诸如“我们大多数客户来自哪个领域?”之类的查询。因为你可以做像

这样的查询
 SELECT AREA_CODE, COUNT(*) FROM TABLE GROUP BY AREA_CODE ORDER BY 2 DESC;

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

答案 2 :(得分:0)

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

@if(!$tickets->count() > 0)
    no tickets created
@else
    @foreach ($tickets as $ticket)
        {{dd($ticket->ticket_replie)}}
        title: {{ $ticket->title}}<br>
        status: {{ returnStatus($ticket->status) }}<br>
        supporter: {{ $ticket->supp_id->username }}
        created: {{ $ticket->created_at }}<br>
    @endforeach
@endif

同样,这假设您的区号始终为2位数。