Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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/
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.
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/
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 ***********************
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 ***********************
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 ***********************