sql >> Base de Datos >  >> RDS >> Sqlserver

CONCAT_WS() para SQL Server

Podemos usar un par de trucos:

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.