Situatie
Am fost nevoit uneori sa extrag din coloana unei tabele (de tip varchar) toate caracterele delimitate de un anumit separator. (cel mai des mi s-a intamplat la importul in sql de csv-uri)
Pentru aceasta am creat o functie care primeste parametrii:
– un strig (sau o coloana de tip varchar dintr-o tabela)
– un parametru de tip varchar (care poate sa fie un caracter sau un sir de caractere) care este delimitatorul din stanga
– un alt parametru de tip varchar (care poate sa fie un caracter sau un sir de caractere) care este delimitatorul din dreapta
Functia intoarce toate stringurile gasite intre cele doua delimitatoare (parametrii 2 si 3)
– functia mai are si doi parametrii suplimentari in care se poate seta comportamentul functiei in cazul in care nu sunt gasite stringurile delimitatoare
@StringNu –
daca se pune null , si delimitatorul stanga exista, dar nu exista delimitatorul dreapta, atunci functia returneaza de la delimitatorul gasit pana la sfarsitul stringului.
daca se pune null , si delimitatorul stanga nu exista, dar exista delimitatorul dreapta, atunci functia returneaza de la inceputul stringului pana la delimitatorul dreapta.
daca se pune altceva decat null la acest prametru, este afisat acel altceva in cazul in care nu exista delimitatorul stanga, sau dreapta ori ambele.
@Off –
in mod normal acest parametru se pune cu valoarea 0
in mod special se pune cu alta valoare decat cea 0 DOAR in cazul in care , daca exista si delimitatorul stanga si cel dreapta , se vrea afisarea si inceputului stringului (aflat la stanga de delimitatorul stanga) daca stringul cautat este gasit de la pozitia @Off in sus
Exemplu (ca sa fie mai clar)
Am stringul urmator:
‘dadadadadaaasu#dfffgggg!gdfhdhh4555’
select dbo.fn_BD_StringIntreDelimitatori ( ‘dadadadadaaasu#dfffgggg!gdfhdhh4555’, ‘#’, ‘!’ , 0, null) intoarce rezultatul dfffgggg
select dbo.fn_BD_StringIntreDelimitatori ( ‘dadadadadaaasu#dfffgggg!gdfhdhh4555’, ‘#’, ‘!’ , 15, null) intoarce rezultatul dfffgggg
DAR
select dbo.fn_BD_StringIntreDelimitatori ( ‘dadadadadaaasu#dfffgggg!gdfhdhh4555’, ‘#’, ‘!’ , 16, null) intoarce rezultatul dadadadadaaasu#dfffgggg
Solutie
— select dbo.fn_BD_StringIntreDelimitatori ( ‘dadadadadaaasu#dfffgggg!gdfhdhh4555’, ‘#’, ‘!’ , 0, null)
CREATE FUNCTION [fn_BD_StringIntreDelimitatori] (
@StringSearch VARCHAR(MAX)
,@Inceput VARCHAR(200)
,@Sfarsit VARCHAR(200)
,@Off INT
,@StringNu VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @OUTPUT as VARCHAR(MAX) = ”
DECLARE @iStart INT
DECLARE @iEnd INT
SET @OUTPUT = ”
SET @OUTPUT = @StringSearch
IF @Inceput IS NOT NULL AND @Sfarsit IS NOT NULL
BEGIN
SET @iStart = CASE WHEN CHARINDEX(@Inceput,@OUTPUT,@Off) = 0
THEN 0
ELSE CHARINDEX(@Inceput,@OUTPUT,@Off) + DATALENGTH(@Inceput) END
IF @iStart <> 0
BEGIN
SET @iEnd = CASE WHEN CHARINDEX(@Sfarsit,@OUTPUT,@iStart + 1) = 0
THEN 0
ELSE CHARINDEX(@Sfarsit,@OUTPUT,@iStart + 1) – @iStart END
END
ELSE
BEGIN
SET @iEnd = CASE WHEN CHARINDEX(@Sfarsit,@OUTPUT,@Off) = 0
THEN 0
ELSE CHARINDEX(@Sfarsit,@OUTPUT,@Off) END
END
END
ELSE IF @Inceput IS NULL
BEGIN
SET @iStart = 1
SET @iEnd = CASE WHEN CHARINDEX(@Sfarsit,@OUTPUT,@Off) = 0
THEN 0
ELSE CHARINDEX(@Sfarsit,@OUTPUT,@Off) – @iStart END
END
ELSE IF @Sfarsit IS NULL
BEGIN
SET @iStart = CASE WHEN CHARINDEX(@Inceput,@OUTPUT,@Off) = 0
THEN 0
ELSE CHARINDEX(@Inceput,@OUTPUT,@Off) + DATALENGTH(@Inceput) END
SET @iEnd = DATALENGTH(@OUTPUT)
END
IF @iStart <> 0 AND @iEnd <> 0
BEGIN
SET @OUTPUT = SUBSTRING(@OUTPUT,@iStart,@iEnd)
END
ELSE IF @StringNu IS NULL
BEGIN
IF @iEnd = 0
SET @iEnd = DATALENGTH(@OUTPUT) + 1
SET @OUTPUT = SUBSTRING(@OUTPUT,@iStart,@iEnd)
END
ELSE
SET @OUTPUT = CASE WHEN @StringNu = ‘@@NULL’ THEN NULL ELSE @StringNu END
RETURN @OUTPUT
END
GO
Leave A Comment?