Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

CONCAT_WS() für SQL Server

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.