Wir können ein paar Tricks anwenden:
- Um
NULL
zu überspringen Werte:COALESCE() - Um nachgestellte Trennzeichen zu vermeiden:fügen Sie es vor jedem Element ein, entfernen Sie das erste danach mit z. STUFF()
Er ist ein funktionierendes Beispiel :
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) |
Der Zweck von STUFF(..., 1, 2, '')
ist das Entfernen des Anfangstrennzeichens (2
ist in unserem Fall die Trennzeichenlänge).
Dies sollte auf SQL Server 2005 (und möglicherweise früheren Versionen) funktionieren.
Hinweis:Anders als beim ursprünglichen CONCAT_WS()
, gibt unsere Version NULL
zurück wenn alle Elemente NULL
sind . Ich denke ehrlich gesagt, dass es eine bessere Wahl ist, aber es sollte sowieso einfach zu ändern sein.