Voici un problème complexe, comment « parser » une phrase avec, non pas un caractères de césure, mais un ensemble ? Cette fonction répond à cette demande en fournissant en sortie une table…
Cette fonction permet de découper une phrase selon de multiples caractère de césure. On parle aussi de split ou splittage.
En entrée :
@PARSEC : les caractères de césure
En sortie, une table comprenant :
colonne 2 : MOT le mot
colonne 3 : CHR le caractère de césure
@PARSEC VARCHAR(256))
RETURNS @T TABLE (POS INT,
MOT VARCHAR(128),
CHR CHAR(1))
AS
/******************************************************************************
* Fonction table de découpage à césure multiple *
*******************************************************************************
* Fred. Brouard - http://sqlpro.developpez.com - www.sqlspot.com - 2009-04-17 *
******************************************************************************/
BEGIN
-- effets de bord
IF @PHRASE IS NULL RETURN;
IF COALESCE(@PARSEC, '') = ''
BEGIN
INSERT INTO @T VALUES (1, @PHRASE, NULL);
RETURN;
END;
-- variables locales
DECLARE @C CHAR(1), -- lettre analysée
@MOT VARCHAR(128), -- mot découpé
@I INT, -- boucle sur phrase
@J INT, -- boucle sur caractère de césure
@JMIN INT, -- premier caractère de césure dans phrase
@IC INT,
@M INT;
SELECT @I = 1, @M = 1, @MOT = '';
-- boucle sur phrase
WHILE @I 0
BEGIN
-- si le mot n'est pas vide
IF @MOT ''
BEGIN
-- on insère le mot
INSERT INTO @T VALUES (@M, LTRIM(@MOT), @C);
-- on incrémente le compteur de mot et on réinitialise le mot
SELECT @M = @M + 1, @MOT = '';
END;
END;
ELSE
SET @MOT = @MOT + @C;
SET @I = @I + 1;
END;
-- insertion du dernier mot
IF @MOT ''
INSERT INTO @T VALUES (@M, @MOT, NULL);
RETURN
END
GO
EXEMPLE :
FROM dbo.F_MULTIPARSE('toto, tata-titi', '-,')
----------- -------------------- ----
1 toto ,
2 tata -
3 titi NULL
COMPTE TENU DE L’INCAPACITÉ CRASSE DE L’ÉQUIPE DE DEVELOPPEZ.COM DE FOURNIR DES OUTILS CORRECTS DE PUBLICATION NOTAMMENT DU CODE, LA FONCTION A ÉTÉ MISE EN FICHIER TEXTE AFIN QUE LE CODE NE SOIT PAS « MANGÉ » PAR LA MISE EN PAGE DÉBILE DES BALISES MAL ÉCRITES…
RETROUVEZ LE CODE COMPLET ET CORRECT DE CETTE FONCTION ICI (F_MULTIPARSE)
NOTA : si vous voulez découper avec le caractère espace (blanc) il ne faut pas le placer en fin du paramètre @PARSEC sinon il sera ignoré du fait du type VARCHAR. Si vous ne voulez parser que sur le blanc, rajouter à la suite du blanc un caractère non imprimable (ASCII inférieur à 20). Par exemple CHAR(8)
--------
Frédéric Brouard, SQLpro - ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com/
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *