6 Ekim 2012 Cumartesi

SQL Serverda Alfanumerik Karakterlerin Temizlenmesi


Numerik karakter almasını istediğimiz bir kolon içinde alfanumerik karakterlerin atılmış olması durumu her zaman baş ağrısına sebep olur. Veritabanını yanlış tasarlanmasından dolayı bu tür sorunlarla her zaman karşılabiliyoruz. Bu durumdada join işlemlerimizde veya metematiksel işlemlerde hata alırız.
Alfanumerik değerler bulunduran bir kolon içindeki alfanumerik karakterleri temizlemek için sql serverda bir kaç farklı method kullanabiliriz. Bu makalemizde bu örneklerden 2 tanesini paylaşacağım.
İlk olarak karakterin ascii değerini veren ASCII fonksiyonunu kullanarak bir değişkendeki alfanumerik karakerleri temizleyeceğiz.
ASCII fonksiyonu tek bir parametre alır ve içine yazılan varchar değerin ilk karakterine ait ASCII değeri verir. A-Z arasındaki ascii değerlerin dışında kalan karakterleri temizlediğimiz zaman değeri sadece numerik karakterlerden oluşmuş hale getireceğiz.

Alfanumerik değerleri ASCII fonksiyonunu kullanarak temizleme:

declare @metin varchar(100)
set @metin = 'Yaz1234Mut987'
declare @uzunluk int= len(@metin)
declare @i int=1

declare @temizMetin varchar(max)
set @temizMetin = '' --yeni degeri atayacağımız metin
while @i<=@uzunluk
begin
 if ASCII(SUBSTRING(@metin,@i,1))>=48 and ASCII(SUBSTRING(@metin,@i,1))<=57
 --48 ile 57 arasında ascii değeri olan karakterler 0-9 aralığıdır.
 begin
  set @temizMetin=@temizMetin+SUBSTRING(@metin,@i,1)
  -- 0-9 arasındaki değerleri sırası ile yeni metne ekliyoruz.
  --böylece 0-9 arasında olmayan karakterleri almamış oluyoruz.
  end
 set @i=@i+1
end
print @temizMetin

Yukarıdaki sogu sonucunda 'Yaz1234Mut987' olarak verilen string değer '1234987' olarak çıkar. Böylece alfanumerik karakterleri temizlemik olduk.

Belirli Karakterlerin Arasında Kalan Metin Nasıl Bulunur.



Tablomuzda ki veriler kirli olduğu zaman genelde metin alanları temizlemek zorunda kalırız. Bunlara örnek olarak belirli bir karakter içinde alan kısmı almak olabilir. İş yerinde il bilgisinin parantez içinde yazılmış olduğu bir veri ile karşılaştım. MEtin içinden il bilgisini alabilmek için basit bir sql script kullanmamız gerekti. Belki başka ihtiyacı olanlarda olabilir diye bu basit scripti sizlerle paylaşmak istedim.
İlk olarak örnek olarak kullanacağımız bir tablo oluşturup içine verilerimizi atalım
?
1
2
3
4
5
6
7
8
9
10
11
12
13
create table Kisi
(
    ID int,
    Ad varchar(50),
    Soyad varchar(50),
    Adres varchar(100)
)
insert into Kisi Values
(1,'Sabri','KUNT','Eskişehir Yolu 9.km ÇANKAYA (ANKARA)'),
(2,'Esat','ÖZDAĞ','Mevlana müzesi anrkası (KONYA)'),
(3,'Ali','RÜZGAR','Organize Sanayi Sitesi No 60 (BURSA)'),
(4,'Seher','KUNT','Gazi Ünv Teknokenti (ANKARA)'),
(5,'Ali','KALFA','Beykoz Merkez Mahallesi(İSTANBUL)')
Yukarıdaki Tabloda parantez içinde kalan il ismini almak için ilk olarak parantez açma '(' ve parantez kapatma ')' karakterlerinin indexlerini bulalım. Bunu için aşağıdaki scripti kullanabilirsiniz.
?
1
2
select *,CHARINDEX('(',Adres) as ParantezAcilis, CHARINDEX(')',Adres) as ParantezKapama
  from Kisi
Parantezleri nasıl bulacağımız anladığımıza göre şimdi arasında kalan metni alalım.
?
1
2
3
select *,
substring(Adres, CHARINDEX('(',Adres)+1 ,CHARINDEX(')',Adres)-CHARINDEX('(',Adres)-1)
  from Kisi
Gördüğünüz gibi basit ve kullanışlı bir yöntem. Bunun dışında karşılaştığınız sorunları bizlerle paylaşarak, diğer ihtiyacı olan kişilere faydalı olabilirsiniz.