Имам изискване да форматирам телефонните номера по следния начин:
- Без интервали
- Без специални знаци
- Премахнете предходната нула - ако съществува код на област
- Премахнете кода на държавата, ако има такъв, напр. +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;
N.B. Клиентски запис може да има повече от 1 телефонен номер и един и същи телефонен номер може да съществува в повече от 1 клиентски запис.
+44
, така и със специфичните за страната еквиваленти, като001
за обаждане до САЩ от Обединеното кралство? - person Alex Poole   schedule 06.01.2014