Comparare coloane text

Rezolvare problema (Fix IT)

Situatie

Deseori avem nevoie sa comparam doua coloane de tip text, unele avand datele scrise in ele cu litere mici, altele cu litere mari, altele au spatii la inceput sau la sfarsit, iar unele, in cazul cel mai dificil, avand diacritice.

Solutie

Pt a reusi sa comparam datele din doua astfel de coloane in primul rand trebuie sa eliminam spatiile de la inceputul si de la sfarsitul coloanelor.

Aceasta se face folosind functiile predefinite ale SQL Serverului , ltrim si rtrim.

Prima dintre ele scoate spatiile de la inceput, iar a doua de la sfarsit.

Presupunand ca am avea o coloana denumita NUME, instructiunea pt a scoate spatiile ar fi:

select ltrim( rtrim (NUME)) from tabela

Dupa ce am scos spatiile de la inceput si de la sfarsit trebuie sa rezolvam problema literelor mici si mari, pt ca intr-o coloana poate sa fie scris “Popescu” iar in alta “popescu”.

Solutia este de a face , in timpul comparatiei, toate literele mari sau mici.

Pt aceasta exista functiile predefinite upper si lower.

Daca alegem sa le facem mari, atunci sintaxa este:

select upper (ltrim( rtrim (NUME))) from tabela

Acum vine partea cea mai dificila.

In cazul in care in una dintre coloane sunt si diacritice (sau posibil alte caractere ascii) lucrurile se complica putin.

Pt a scapa de diacritice si de alte caractere ascii am dezvoltat urmatoarea functie.

 

 

CREATE FUNCTION [dbo].[US_ASCII_CONVERT]
(
@InputString nvarchar(255)
)
RETURNS nvarchar(255)
AS
BEGIN

if @InputString is null or @InputString = ”
return @InputString

declare @position int,
@returnVal nvarchar(255),
@unicodeVal int,
@char nvarchar(1),
@dataLen int
select @position = 1, @returnVal=”, @dataLen = DATALENGTH(@InputString)

WHILE @position <= @dataLen
BEGIN
set @char= SUBSTRING(@InputString, @position, 1)
set @unicodeVal= UNICODE(@char)
if @unicodeVal not in
(
250, 915, 9567, 226, 960, 949, 238, 209, 73, 9579, 161, 186, 192, 217,163,209,217,
9553, 9557, 9580, 170, 172, 9492, 9572, 9632, 9612, 9616, 9496, 9618,165,163,177 ,192 ,
194, 537, 539, 259, 258, 536, 538, 226
)
set @returnVal=@returnVal+ @char
else
SET @returnVal= @returnVal +
CASE @unicodeVal
WHEN 250 THEN ‘t’ –‘ú’
WHEN 949 THEN ‘i’ –‘ε’
–WHEN 209 THEN ‘a’ –‘Ñ’
WHEN 73 THEN ‘I’ –‘Î’
WHEN 9492 THEN ‘s’ –‘└’
WHEN 9572 THEN ‘S’ –‘╤’
WHEN 915 THEN ‘a’ –‘Γ’
WHEN 9496 THEN ‘T’ –‘┘’
WHEN 9580 THEN ‘I’ –‘╬’
WHEN 226 THEN ‘a’ –‘â’
WHEN 9579 THEN ‘I’ –‘╫’
WHEN 170 THEN ‘S’ –‘ª’
WHEN 9616 THEN ‘T’ –‘▐’
WHEN 9557 THEN ‘S’ –‘╕’
WHEN 9567 THEN ‘a’ –‘╟’
WHEN 172 THEN ‘S’ –‘¬’
WHEN 9553 THEN ‘s’ –‘║’
WHEN 960 THEN ‘a’ –‘π’
WHEN 238 THEN ‘i’ –‘î’
WHEN 161 THEN ‘s’ –‘¡’
WHEN 9632 THEN ‘t’ –‘■’
WHEN 186 THEN ‘s’ –‘º’
WHEN 9612 THEN ‘T’ –‘▌’
when 9618 THEN ‘A’ — ▒
when 165 THEN ‘a’ –¥
when 163 THEN ‘t’–£

WHEN 177 THEN ‘A’–±
WHEN 192 then ‘s’ –sh
when 209 then ‘S’–Ñ
WHEN 217 THEN ‘T’–Ù
–when 217 then ” –Ù
WHEN 192 THEN ‘s’ –À

when 259 then ‘a’ –ă
when 258 then ‘A’ –Ă
when 537 then ‘s’ –ș
when 536 then ‘S’ –Ș
when 539 then ‘t’ –ț
when 538 then ‘T’ –Ț
when 226 then ‘a’ –â
when 194 then ‘A’ –Â

ELSE @char
END
SET @position = @position + 1
END

return @returnVal

END

 

Aceasta functie se pune pe baza pe care avem tabela (sau tabelele) ce contine coloanele respective, si apoi se adauga aceasta functie in instructiunea de mai sus, care acum devine:

select upper (ltrim( rtrim ([dbo].[US_ASCII_CONVERT](NUME)))) from tabela

Astfel, ruland instructiunea de mai sus, doua valori care initial erau asa:   ” arma ”   si “Armă”   vor deveni ambele “ARMA” iar comparatia dintre ele care initial ar fi avut valoarea de adevar FALSE va avea acum valoarea de adevar TRUE.

 

Tip solutie

Permanent

Voteaza

(15 din 34 persoane apreciaza acest articol)

Despre Autor

Leave A Comment?