2016-01-20 7 views
1

Есть ли какая-либо функция в oracle, которая может дать ему номер телефона, как параметр, а на выходе: код + номер телефона.есть какой-либо способ отделить код города от номера телефона в oracle

Exemple:

параметр: +3323658568526 или 003323658568526 (французский код страны)

возвращение:

  • код города: +33
  • Номер телефона: 23658568526
+0

См., Если это поможет: http://stackoverflow.com/questions/41925/is-there-a-standard-for-storing-normalized-phone-numbers-in-a-database – Vampiro

ответ

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. Лучше будет хранить их отдельно. Вы могли бы нормализовать данные дальше.

+0

Спасибо, Лалит, очень приятное решение. Точно, количество цифр кода области варьируется от страны к другой. поэтому мне нужно обработать это с помощью ** CASE **, но я думаю, что мне нужно больше CASES для решения проблемы ... и что моя большая функция. Что вы думаете о таблице, содержащей код области? – badaoui220

+0

@ badaoui220 Если у вас есть таблица, содержащая коды области, вы можете просто присоединиться к таблицам. Условием объединения будет код области и substr в моем решении. –

+0

Благодарим вас за интерактивность :) – badaoui220

0

Лучший способ справиться с этим требованием состоит в том, чтобы иметь два отдельных столбцы для кода зоны и номера телефона. Это помогает в производительности - поскольку нет необходимости выполнять операции подстроки, которые могут негативно повлиять на производительность.

Еще одна причина заключается в том, что количество цифр в телефонном номере может быть различным, поэтому может оказаться трудным найти, где заканчивается код (если вы не используете разделитель, что снова приводит к операции подстроки).

Когда вам нужно отобразить номер в пользовательском интерфейсе, вы можете конкатенацию и отображение.

Также полезно запускать запросы типа «Какая область, из которой приходит большинство наших клиентов?» как вы можете делать запросы, как

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

Как Код не имеет много различных значений, так что наличие его в качестве ведущего столбца в индексе также помогает выполнять индексных Пропустить Сканы и указательным Fast Полное сканирование.

+0

Спасибо за ваш ответ, ваш дизайн настолько ясен и логичен в случае, когда мы начинаем проект с нуля, но теперь проект уже существует, и нам нужно реализовать это решение для связи с WS :) – badaoui220

+0

Затем используйте подстроку и добавьте индекс, основанный на функции, для компенсации для производительности. – Vampiro

0

Можно даже попробовать с регулярными выражениями:

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 цифры.