SQL Serverda Alfanumerik Karakterlerin Temizlenmesi

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:

declare @metin varchar(100)
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 @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

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 @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 arasinda olmayan anlamina geliyor.
END
SELECT @metin

Yukaridaki sorgu sonucunda ‘9$%sabri45623 *6%}@~:’ ifadesi ‘9456236’ olarak alfanumerik karakterlerden temizlenmis oldu.

.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir