Nous pouvons utiliser quelques astuces :
- Pour ignorer
NULL
valeurs :COALESCE() - Pour éviter le séparateur de fin :ajoutez-le avant chaque élément, supprimez le premier après avec, par exemple, STUFF()
Il est un exemple de travail :
CREATE TABLE foo (
id INT IDENTITY(1, 1) NOT NULL,
a VARCHAR(50),
b VARCHAR(50),
c VARCHAR(50),
d VARCHAR(50),
PRIMARY KEY (id)
);
INSERT INTO foo (a, b, c, d) VALUES ('a', 'b', 'c', 'd');
INSERT INTO foo (a, b, c, d) VALUES (NULL, 'b', NULL, 'd');
INSERT INTO foo (a, b, c, d) VALUES ('a', NULL, NULL, 'd');
INSERT INTO foo (a, b, c, d) VALUES (NULL, NULL, NULL, NULL);
SELECT id,
STUFF(
COALESCE('; ' + a, '') +
COALESCE('; ' + b, '') +
COALESCE('; ' + c, '') +
COALESCE('; ' + d, ''),
1, 2, '') AS bar
FROM foo
ORDER BY id
| ID | BAR |
|----|------------|
| 1 | a; b; c; d |
| 2 | b; d |
| 3 | a; d |
| 4 | (null) |
Le but de STUFF(..., 1, 2, '')
est de supprimer le séparateur initial (2
est la longueur du séparateur dans notre cas).
Cela devrait fonctionner sur SQL Server 2005 (et éventuellement des versions antérieures).
Remarque :contrairement à l'original CONCAT_WS()
, notre version renvoie NULL
lorsque tous les éléments sont NULL
. Je pense honnêtement que c'est un meilleur choix, mais ça devrait être facile à changer de toute façon.