У меня есть требование форматировать номера телефонов следующим образом:
- Нет пробелов
- Нет специальных символов
- Удалить предшествующий ноль - если существует код города
- Удалите код страны, если он есть, например. +44
Например, это: (03069) 990927
станет: 3069990927
.
До сих пор я пришел к этому:
replace(replace(replace(replace(replace(replace(substr(replace(ltrim([VALUE],0), ' ', ''),nvl(length(substr(replace(ltrim([VALUE],0), ' ', ''),11)),0)+1), '-', ''), '(', ''), ')', ''),'/', ''), '.', ''), '+', '')
Есть ли более короткая версия этого, возможно, с использованием регулярного выражения?
Окончательная версия этого фрагмента станет столбцом в представлении, которое вернет следующие столбцы:
- Номер клиента
- Имя Клиента
- Страна
- Отформатированный номер телефона
Отформатированный номер телефона будет объединен с международным телефонным кодом (например, +44), сохраненным в базе данных в таблице — DIALCODE_TAB(COUNTRY_CODE, CODE). Ниже приведен пример использования приведенного выше синтаксиса replace
:
CREATE OR REPLACE FORCE VIEW "CUST_PHONE" ("CUSTOMER_ID", "NAME", "COUNTRY", "PHONE_NUMBER") AS
select
cicm.customer_id,
cicm.name,
dct.country,
dct.code || replace(replace(replace(replace(replace(replace(substr(replace(ltrim(cicm.value,0), ' ', ''),nvl(length(substr(replace(ltrim(cicm.value,0), ' ', ''),11)),0)+1), '-', ''), '(', ''), ')', ''),'/', ''), '.', ''), '+', '') phone_number
from customer_info_comm_method cicm
join dialcode_tab dct
on dct.country_code = customer_info_api.get_country_code(cicm.customer_id)
where cicm.method_id_db = 'PHONE'
--and dct.code || replace(replace(replace(replace(replace(replace(substr(replace(ltrim(cicm.value,0), ' ', ''),nvl(length(substr(replace(ltrim(cicm.value,0), ' ', ''),11)),0)+1), '-', ''), '(', ''), ')', ''),'/', ''), '.', ''), '+', '') = [phone_number]
--in terms of performance this SQL has to be written so that it returns all the records or a specific record when searching for the phone number - very quickly (<10s).
WITH read only;
Н.Б. Запись клиента может содержать более 1 номера телефона, и один и тот же номер телефона может существовать более чем в 1 записи клиента.
+44
, так и с эквивалентами для конкретной страны, например001
, чтобы звонить в США из Великобритании? - person Alex Poole   schedule 06.01.2014