We kunnen een paar trucjes gebruiken:
- Om
NULL
over te slaan waarden:COALESCE() - Om trailing separator te vermijden:voeg het voor elk item toe, verwijder het eerste daarna met b.v. STUFF()
Hij is een werkend voorbeeld :
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) |
Het doel van STUFF(..., 1, 2, '')
is om het eerste scheidingsteken te verwijderen (2
is de lengte van het scheidingsteken in ons geval).
Dit zou moeten werken op SQL Server 2005 (en mogelijk eerdere versies).
Opmerking:in tegenstelling tot de originele CONCAT_WS()
, onze versie retourneert NULL
wanneer alle items NULL
zijn . Ik denk eerlijk gezegd dat het een betere keuze is, maar het moet toch gemakkelijk te veranderen zijn.