OVH Cloud OVH Cloud

Split ?

2 réponses
Avatar
Christophe
Bonjour,

juste pour savoir comment faire simplement ou exist'il l'equivalent d'un
SPLIT en SQL ?

Merci

2 réponses

Avatar
Rudi Bruchez
Christophe a écrit:

Bonjour,

juste pour savoir comment faire simplement ou exist'il l'equivalent d'un
SPLIT en SQL ?

Merci



Bonjour,

l'équivalent du split Perl ou Ruby ? Il n'y a rien de tel en SQL. Une UDF
(User Defined Function) qui utilise SUBSTRING et CHARINDEX en retournant
une table (table-valued function) devrait vous sortir d'affaire. Vous
pouvez ensuite l'utiliser dans un JOIN par exemple.

--
Rudi Bruchez, MCDBA
http://www.babaluga.com/
Avatar
SQLpro [MVP]
Christophe a écrit :
Bonjour,

juste pour savoir comment faire simplement ou exist'il l'equivalent d'un
SPLIT en SQL ?

Merci





Ces deux fonctions peuvent peut être vous aider :
L'une renvoie la position du motif d'ordre n
l'autre renvoie la chaine de caractère entre deux motifs dont le premier
est à l'ordre n

A +


CREATE FUNCTION F_POS_N_CHAR(@MOT VARCHAR(8000), @CHR CHAR(1), @POS INT)
RETURNS INT
AS

/***************************************************************************
***
Base : <générique>
Schema : dbo
Objet : fonction
Auteur : Frédéric Brouard
Copyright : L4 Logistics
Créée le : 2006-04-14
Release :
********************************* UTILISATION
*********************************
Description : détermine la position de l'occurrence neme d'un caractère
spécifié Paramètres : IN : @MOT chaîne dans laquelle on cherche la
présence des caractères
@CHR caractères cherché
@POS neme caractère demandé
OUT : chaine
* ********************************* EXEMPLES
**********************************
SELECT dbo.F_POS_N_CHAR('-AAA-BB-CCCC-DD-E--', '-', -1) => 0 SELECT
dbo.F_POS_N_CHAR('-AAA-BB-CCCC-DD-E--', '-', 0) => 0 SELECT
dbo.F_POS_N_CHAR('-AAA-BB-CCCC-DD-E--', '-', 1) => 1 SELECT
dbo.F_POS_N_CHAR('-AAA-BB-CCCC-DD-E--', '-', 2) => 5 SELECT
dbo.F_POS_N_CHAR('-AAA-BB-CCCC-DD-E--', '-', 3) => 8 SELECT
dbo.F_POS_N_CHAR('-AAA-BB-CCCC-DD-E--', '-', 4) => 13 SELECT
dbo.F_POS_N_CHAR('-AAA-BB-CCCC-DD-E--', '-', 5) => 16 SELECT
dbo.F_POS_N_CHAR('-AAA-BB-CCCC-DD-E--', '-', 6) => 18 SELECT
dbo.F_POS_N_CHAR('-AAA-BB-CCCC-DD-E--', '-', 7) => 19 SELECT
dbo.F_POS_N_CHAR('-AAA-BB-CCCC-DD-E--', '-', 8) => NULL
****************************************************************************
**/

BEGIN

-- return null on null input
IF @MOT IS NULL OR @CHR IS NULL OR @POS IS NULL
RETURN NULL

-- conditions limites
IF @MOT = '' OR @POS < 1
RETURN 0

-- variables locales
DECLARE @CNT INT
DECLARE @C CHAR(1)
DECLARE @OUT INT
SET @CNT = 0
SET @OUT = 1

-- boucle de traitement de lecture caractère par caractère WHILE @OUT <=
LEN(@MOT) BEGIN

SET @C = SUBSTRING(@MOT, @OUT, 1)
-- caractère trouvé
IF @C = @CHR
BEGIN
-- incrémente compteur de car trouvé
SET @CNT = @CNT + 1
-- si compteur de car trouvé = nombre demandée, la position est là
IF @CNT = @POS
BREAK
END
-- sinon, incrément
SET @OUT = @OUT + 1

END

-- on vérifie que compteur de car trouvé = nombre demandée, IF NOT @CNT
= @POS
SET @OUT = NULL

-- on retourne la valeur
RETURN @OUT

END

GO


CREATE FUNCTION F_PARSE_ON_CHAR(@MOT VARCHAR(8000), @CHR CHAR(1), @POS INT)
RETURNS VARCHAR(8000)
AS
/***************************************************************************
***
Base : <générique>
Schema : dbo
Objet : fonction
Auteur : Frédéric Brouard
Copyright : L4 Logistics
Créée le : 2006-04-14
Release :
********************************* UTILISATION
*********************************
Description : renvoie une sous chaine de position n délimitée par le
caractère
spécifiédé
Paramètres : IN : @MOT chaîne dans laquelle on cherche la chaîne
@CHR caractère de délimiation
@POS neme sous chaine demandée
OUT : chaine
* ********************************* EXEMPLES
**********************************
SELECT dbo.F_PARSE_ON_CHAR('-AAA-BB-CCCC-DD-E--', '-', -1) =>
-AAA-BB-CCCC-DD-E--
SELECT dbo.F_PARSE_ON_CHAR('-AAA-BB-CCCC-DD-E--', '-', 0) =>
-AAA-BB-CCCC-DD-E--
SELECT dbo.F_PARSE_ON_CHAR('-AAA-BB-CCCC-DD-E--', '-', 1) => [chaine
vide] SELECT dbo.F_PARSE_ON_CHAR('-AAA-BB-CCCC-DD-E--', '-', 2) => AAA
SELECT dbo.F_PARSE_ON_CHAR('-AAA-BB-CCCC-DD-E--', '-', 3) => BB SELECT
dbo.F_PARSE_ON_CHAR('-AAA-BB-CCCC-DD-E--', '-', 4) => CCC SELECT
dbo.F_PARSE_ON_CHAR('-AAA-BB-CCCC-DD-E--', '-', 5) => DD SELECT
dbo.F_PARSE_ON_CHAR('-AAA-BB-CCCC-DD-E--', '-', 6) => E SELECT
dbo.F_PARSE_ON_CHAR('-AAA-BB-CCCC-DD-E--', '-', 7) => [chaine vide]
SELECT dbo.F_PARSE_ON_CHAR('-AAA-BB-CCCC-DD-E--', '-', 8) => [chaine vide]
****************************************************************************
**/
BEGIN

-- return null on null input
IF @MOT IS NULL OR @CHR IS NULL OR @POS IS NULL
RETURN NULL

-- conditions limites
IF @MOT = '' OR @POS < 1
RETURN @MOT

-- variables locales
DECLARE @DEB INT, @FIN INT

-- boucle de traitement de lecture des sous chaînes IF @POS = 1 BEGIN
SET @DEB = 1
SET @FIN = COALESCE(dbo.F_POS_N_CHAR(@MOT, @CHR, 1) -1 , LEN(@MOT))
END ELSE BEGIN
SET @DEB = dbo.F_POS_N_CHAR(@MOT, @CHR, @POS -1) + 1
SET @FIN = COALESCE(dbo.F_POS_N_CHAR(@MOT, @CHR, @POS) - 1,
LEN(@MOT)) END

-- on retourne la valeur
RETURN SUBSTRING(@MOT, @DEB, @FIN - @DEB + 1)

END

GO


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************