Enes TAŞ

Developer

MS SQL'de Telefon Numarası Formatlama 11.08.2017

Bir web sitesi ya da herhangi bir proje geliştirirken, telefon, e-mail adresi gibi alanlarda maskeleme kullanmaya ihtiyaç duyuyoruz. Peki ya geliştirdiğiniz sisteme excelden kayıt aktarmanız gerekiyorsa veya eski veritabanından düzensiz formatta kayıt aktarmanız gerekiyorsa? İşler o zaman biraz can sıkıcı hale gelebiliyor. 

Başıma böyle bir durum geldi, geliştirmiş olduğum sistemin eski veritabanındaki müşteri kayıtlarını yeni sisteme aktarmam gerekiyordu ve telefon numaraları maskeleme olmamasından dolayı çok dağınık kaydedilmişti. Bende bunun için sql de küçük bir function yazdım. 

Sistem de kullanmış olduğum maskeleme formatı "553-111-22-33" bu şekildeydi. Aktarmak istediğim verilerde telefon numaraları "05531112233", "5531112233" yada alan kodu olmadan "1112233" ya da aralarında boşluklar olacak şekilde kaydedilmişti. Böyle bir veriyi maskeleme uyguladığım elemente set etmek istediğim de edemiyordum, kullandığım jquery maskeleme eklentisi bu işi benim için çözemiyordu :)

sql de yazdığım function yardımıyla verileri düzenli bir şekilde aktardım.

Create Function [dbo].[PhoneFormat]

(@Phone nvarchar(20))

returns nvarchar(20)

as

begin


Declare @ReturnPhone nvarchar(20);


Set @ReturnPhone = (


Case


When len(replace(@Phone,' ',''))=10

then LEFT(replace(@Phone, ' ',''), 3) + '-' + SUBSTRING(replace(@Phone, ' ',''), 4,3) + '-' +

SUBSTRING(replace(@Phone, ' ',''), 7,2) + '-' + RIGHT(replace(@Phone, ' ',''),2)


When  len(replace(@Phone,' ',''))=11

then SUBSTRING(replace(@Phone, ' ',''), 2,3) + '-' + SUBSTRING(replace(@Phone, ' ',''), 5,3) + '-' +

SUBSTRING(replace(@Phone, ' ',''), 8,2) + '-' + RIGHT(replace(@Phone, ' ',''),2)


When  len(replace(@Phone,' ',''))=7

then  LEFT(replace('000' + @Phone, ' ',''), 3) + '-' + SUBSTRING(replace('000' + @Phone, ' ',''), 4,3) + '-' +

SUBSTRING(replace('000' + @Phone, ' ',''), 7,2) + '-' + RIGHT(replace('000' + @Phone, ' ',''),2)


else @Phone

end

);

return @ReturnPhone;

end

Kullanımı ise şu şekilde; 

Select dbo.PhoneFormat('05531112233')


Sonuç : 553-111-22-33

Select dbo.PhoneFormat('5531112233')


Sonuç : 553-111-22-33

Select dbo.PhoneFormat('1112233')


Sonuç : 000-111-22-33 


Ben eğer başında alan kodu yok ise 000 eklemeyi tercih ettim. Benim o anlık işimi çözdü, umarım sizin de işinize yarar :)

Kolay gelsin.


Etiketler

SQL
Emre - 15.08.2017 20:47

Çok işime yaradı, ellerine sağlık hocam :)

korasoglu - 29.01.2021 01:35

eline sağlık güzel ama ben bu yaşıma kadar defalarca telefon numara karakterlerin değiştiğini gördüm yarın sabah telefon numarası uzunluğu 20 olursa senin sorguyu merak ettim.

Enes - 29.01.2021 09:25

Merhaba, bu fonksiyon basit bir fonksiyon. Her kombinasyonda çalışmayabilir. 20 karakterlik bir veri tam olarak nasıl bir veri örneklemek lazım, fonksiyon ona göre de geliştirilebilir. Örneğin aşağıdaki örnekler için; "555 111 111 1 ", "(555) 111 111 1 ", "+90 (555) 11 1 - 111 1" fonksiyonun başına basitçe şöyle bir komut eklenebilir. Set @Phone=RIGHT(replace(replace(replace(replace(REPLACE(@Phone, '(', ''), ')',''),'+',''), ' ' ,''), '-',''),10); daha karmaşık veriler için regex ile çözümler yapmak gerekebilir tabi.

AYSUN - 24.07.2022 00:59

merhaba,peki telefon numaralarını nasıl toplayabiliriz .5+2+3+..... gibi sorgu konusunda yardımcı olabilir misiniz

Enes - 25.07.2022 07:31

Merhaba,

basitçe şöyle bir fonksiyon hazırladım. Bunu kullanabilirsiniz.

CREATE FUNCTION [dbo].[RakamTopla](@deger nvarchar(100))
RETURNS INT
as
BEGIN
    DECLARE @toplam INT =0;
    DECLARE @i INT = 1;
    DECLARE @n INT = LEN(@deger);

    WHILE @i<=@n
    BEGIN
        SET @toplam+= CAST(SUBSTRING(@deger, @i, 1) AS INT)
        set @i+=1
    END

    RETURN @toplam
END

Kullanım örneği;

Select dbo.RakamTopla('5555555555')

Yorum Yap