Cautare string intre doi delimitatori

Configurare noua (How To)

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

Tip solutie

Permanent

Voteaza

(28 din 61 persoane apreciaza acest articol)

Despre Autor

Leave A Comment?