Published on

September 21, 2006

Travailler avec des données séparées par des virgules dans SQL Server

Lorsque vous travaillez avec des données dans SQL Server, vous pouvez rencontrer des situations où les données sont stockées ou présentées dans un format séparé par des virgules. Dans cet article, nous explorerons deux scénarios courants impliquant des données séparées par des virgules et discuterons de la manière de les gérer efficacement.

Scénario 1: Affichage de plusieurs enregistrements à partir d’un seul enregistrement

Dans ce scénario, vous avez une table avec une colonne contenant des valeurs séparées par des virgules. Chaque enregistrement dans la table représente une entité unique, mais vous devez analyser la colonne séparée par des virgules et renvoyer chaque valeur comme une ligne distincte. Jetons un coup d’œil à un exemple:

CREATE TABLE Example1 (
  Id INT,
  TypeOfValues VARCHAR(20),
  ColumnOfValues CHAR(30)
)

INSERT INTO Example1 VALUES (1, 'Couleurs', 'Rouge,Vert,Bleu,Noir,Blanc')
INSERT INTO Example1 VALUES (2, 'Modèles', 'Normal,Deluxe,Super Deluxe')
INSERT INTO Example1 VALUES (3, 'Années', '2004,2005,2006')

SELECT Id, TypeOfValues, SUBSTRING(ColumnOfValues, Number, CHARINDEX(',', ColumnofValues + ',', Number) - Number) AS Value
FROM Example1
INNER JOIN Numbers ON SUBSTRING(',' + ColumnOfValues, Number, 1) = ','
WHERE Number <= LEN(ColumnOfValues) + 1

Dans cet exemple, nous créons une table appelée “Example1” avec trois enregistrements. Chaque enregistrement a une colonne “TypeOfValues” et une colonne “ColumnOfValues”, qui contient une chaîne de valeurs séparées par des virgules. En utilisant une table Numbers et les fonctions SUBSTRING et CHARINDEX, nous pouvons analyser la colonne “ColumnOfValues” et renvoyer plusieurs enregistrements pour chaque enregistrement dans la table “Example1”.

Scénario 2: Affichage d’un seul enregistrement avec une colonne séparée par des virgules à partir de plusieurs enregistrements

Dans ce scénario, vous avez une table avec plusieurs enregistrements contenant une colonne clé et une colonne valeur. Chaque clé peut avoir plusieurs valeurs associées. L’objectif est de regrouper toutes les paires clé-valeur dans un seul enregistrement, où la clé est suivie d’une chaîne séparée par des virgules de toutes les valeurs associées. Voyons un exemple:

CREATE TABLE Example2 (
  id_no INT NOT NULL,
  item VARCHAR(20) NOT NULL
)

INSERT INTO Example2 VALUES (1, 'Ski')
INSERT INTO Example2 VALUES (1, 'Plongée')
INSERT INTO Example2 VALUES (2, 'Plongée')
INSERT INTO Example2 VALUES (2, 'Ski')
INSERT INTO Example2 VALUES (2, 'Chasse')
INSERT INTO Example2 VALUES (2, 'Pêche')
INSERT INTO Example2 VALUES (4, 'Voile')
INSERT INTO Example2 VALUES (4, 'Ski')
INSERT INTO Example2 VALUES (5, 'Ski')

DECLARE @p VARCHAR(1000)
DECLARE @i CHAR(5)
DECLARE @sm INT
DECLARE @m INT

SET @p = ''
SET @m = (SELECT TOP 1 id_no FROM Example2 ORDER BY id_no)
SET @sm = 0

WHILE @m <> @sm
BEGIN
  SET @sm = @m

  SELECT @i = id_no, @p = CASE WHEN @p = '' THEN item ELSE @p + ', ' + item END
  FROM Example2 a
  WHERE id_no = @m

  PRINT @i + ' ' + @p

  SELECT TOP 1 @m = id_no FROM Example2 WHERE id_no > @sm ORDER BY id_no
  SET @p = ''
END

Dans cet exemple, nous créons une table appelée “Example2” avec plusieurs enregistrements. Chaque enregistrement a une colonne “id_no” et une colonne “item”. En utilisant une boucle WHILE et en concaténant les valeurs “item” avec une virgule, nous pouvons regrouper tous les enregistrements pour chaque “id_no” en une seule ligne dans la sortie.

Conclusion

Travailler avec des données séparées par des virgules dans SQL Server peut être un défi, mais avec les bonnes techniques, cela peut être facilement géré. Dans cet article, nous avons exploré deux scénarios courants et fourni des exemples de code pour vous aider à gérer efficacement des données séparées par des virgules. La prochaine fois que vous rencontrerez des données séparées par des virgules, vous aurez une longueur d’avance pour écrire votre code T-SQL pour y travailler.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.