Podemos usar un par de trucos:
- Para omitir
NULL
valores:COALESCE() - Para evitar el separador final:agréguelo antes de cada elemento, elimine el primero después con, p. COSAS()
Es un ejemplo funcional :
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) |
El propósito de STUFF(..., 1, 2, '')
es quitar el separador inicial (2
es la longitud del separador en nuestro caso).
Esto debería funcionar en SQL Server 2005 (y posiblemente en versiones anteriores).
Nota:a diferencia del CONCAT_WS()
original , nuestra versión devuelve NULL
cuando todos los elementos son NULL
. Sinceramente, creo que es una mejor opción, pero debería ser fácil de cambiar de todos modos.