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.

Alfanumerik Karakterlerin ASCII kodları (A-Z ve a-z):

asciiDegerikarakterasciiDegerikarakter
65A94^
66B95_
67C96`
68D97a
69E98b
70F99c
71G100d
72H101e
73I102f
74J103g
75K104h
76L105i
77M106j
78N107k
79O108l
80P109m
81Q110n
82R111o
83S112p
84T113q
85U114r
86V115s
87W116t
88X117u
89Y118v
90Z119w
91[120x
92\121y
93]122z
Sizde Yukarıdaki tabloyu aşağıdaki sorgu ile oluşturabilirsiniz.

declare @Table Table (asciiDegeri int,karakter char)
declare @asciiDeger int
set @asciiDeger = 65
while @asciiDeger <= 122
begin
  insert into @Table values(@asciiDeger ,char(@asciiDeger))
  set @asciiDeger = @asciiDeger+1
end
select * from @Table

Şimdi Alfanumerik Karakterleri temizlemenin diğer bir yöntemine bakalım. Bu metodda ise PARHINDEX ve STUFF fonksiyonlarını kullanacağız. PATHINDEX fonksiyonu, bir metin içinde istediğimiz paterne uyan bir değer varsa bunun indexini döndürür. STUFF ise bir metin içinde belirli bir indexdeki değeri başka bir değerle değiştirmek için kullanılır.

DECLARE @metin VARCHAR(32)
DECLARE @i int
SELECT @metin = '9$%sabri45623 *6%}@~:'
SELECT @i = PATINDEX('%[^0-9]%', @metin)
WHILE @i > 0
BEGIN
  SELECT @metin = STUFF(@metin, @i, 1, '')
  SELECT @i = PATINDEX('%[^0-9]%', @metin)
  --[^0-9] ifadesi 0 ile 9 arasında olmayan anlamına geliyor.
END
SELECT @metin

Yukarıdaki sorgu sonucunda '9$%sabri45623 *6%}@~:' ifadesi '9456236' olarak alfanumerik karakterlerden temizlenmiş oldu.

Hiç yorum yok:

Yorum Gönder