Numerik karakter almasini istedigimiz bir kolon içinde alfanumerik karakterlerin atilmis olmasi durumu her zaman bas agrisina sebep olur. Veritabanini yanlis tasarlanmasindan dolayi bu tür sorunlarla her zaman karsilabiliyoruz. Bu durumdada join islemlerimizde veya metematiksel islemlerde hata aliriz.
Alfanumerik degerler bulunduran bir kolon içindeki alfanumerik karakterleri temizlemek için sql serverda bir kaç farkli method kullanabiliriz. Bu makalemizde bu örneklerden 2 tanesini paylasacagim.
Ilk olarak karakterin ascii degerini veren ASCII fonksiyonunu kullanarak bir degiskendeki alfanumerik karakerleri temizleyecegiz.
ASCII fonksiyonu tek bir parametre alir ve içine yazilan varchar degerin ilk karakterine ait ASCII degeri verir. A-Z arasindaki ascii degerlerin disinda kalan karakterleri temizledigimiz zaman degeri sadece numerik karakterlerden olusmus hale getirecegiz.
Alfanumerik degerleri ASCII fonksiyonunu kullanarak temizleme:
set @metin = 'Yaz1234Mut987'
declare @uzunluk int= len(@metin)
declare @i int=1
declare @temizMetin varchar(max)
set @temizMetin = '' --yeni degeri atayacagimiz metin
while @i<=@uzunluk
begin
if ASCII(SUBSTRING(@metin,@i,1))>=48 and ASCII(SUBSTRING(@metin,@i,1))<=57
--48 ile 57 arasinda ascii degeri olan karakterler 0-9 araligidir.
begin
set @temizMetin=@temizMetin+SUBSTRING(@metin,@i,1)
-- 0-9 arasindaki degerleri sirasi ile yeni metne ekliyoruz.
--böylece 0-9 arasinda olmayan karakterleri almamis oluyoruz.
end
set @i=@i+1
end
print @temizMetin
Yukaridaki sogu sonucunda ‘Yaz1234Mut987’ olarak verilen string deger ‘1234987’ olarak çikar. Böylece alfanumerik karakterleri temizlemik olduk.
Alfanumerik Karakterlerin ASCII kodlari (A-Z ve a-z):
asciiDegeri | karakter | asciiDegeri | karakter |
---|---|---|---|
65 | A | 94 | ^ |
66 | B | 95 | _ |
67 | C | 96 | ` |
68 | D | 97 | a |
69 | E | 98 | b |
70 | F | 99 | c |
71 | G | 100 | d |
72 | H | 101 | e |
73 | I | 102 | f |
74 | J | 103 | g |
75 | K | 104 | h |
76 | L | 105 | i |
77 | M | 106 | j |
78 | N | 107 | k |
79 | O | 108 | l |
80 | P | 109 | m |
81 | Q | 110 | n |
82 | R | 111 | o |
83 | S | 112 | p |
84 | T | 113 | q |
85 | U | 114 | r |
86 | V | 115 | s |
87 | W | 116 | t |
88 | X | 117 | u |
89 | Y | 118 | v |
90 | Z | 119 | w |
91 | [ | 120 | x |
92 | \ | 121 | y |
93 | ] | 122 | z |
Sizde Yukaridaki tabloyu asagidaki sorgu ile olusturabilirsiniz.
.
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
Simdi Alfanumerik Karakterleri temizlemenin diger bir yöntemine bakalim. Bu metodda ise PARHINDEX ve STUFF fonksiyonlarini kullanacagiz. PATHINDEX fonksiyonu, bir metin içinde istedigimiz paterne uyan bir deger varsa bunun indexini döndürür. STUFF ise bir metin içinde belirli bir indexdeki degeri baska bir degerle degistirmek için kullanilir.
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 arasinda olmayan anlamina geliyor.
END
SELECT @metin
Yukaridaki sorgu sonucunda ‘9$%sabri45623 *6%}@~:’ ifadesi ‘9456236’ olarak alfanumerik karakterlerden temizlenmis oldu.