Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

CONCAT_WS() per SQL Server

Possiamo usare un paio di trucchi:

  • Per saltare NULL valori:COALESCE()
  • Per evitare il separatore finale:aggiungilo prima di ogni elemento, rimuovi il primo in seguito con ad es. STUFF()

È un esempio funzionante :

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)     |

Lo scopo di STUFF(..., 1, 2, '') consiste nel rimuovere il separatore iniziale (2 è la lunghezza del separatore nel nostro caso).

Questo dovrebbe funzionare su SQL Server 2005 (e possibilmente versioni precedenti).

Nota:a differenza dell'originale CONCAT_WS() , la nostra versione restituisce NULL quando tutti gli articoli sono NULL . Onestamente penso che sia una scelta migliore, ma dovrebbe essere comunque facile da cambiare.