Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

CONCAT_WS() dla SQL Server

Możemy użyć kilku sztuczek:

  • Aby pominąć NULL wartości:POŁĄCZENIE()
  • Aby uniknąć końcowego separatora:dodaj go przed każdym elementem, usuń pierwszy później, np. STUFF()

Jest działającym przykładem :

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

Przeznaczenie STUFF(..., 1, 2, '') jest usunięcie początkowego separatora (2 to długość separatora w naszym przypadku).

Powinno to działać na SQL Server 2005 (i prawdopodobnie na wcześniejszych wersjach).

Uwaga:w przeciwieństwie do oryginalnego CONCAT_WS() , nasza wersja zwraca NULL gdy wszystkie elementy są NULL . Szczerze myślę, że to lepszy wybór, ale i tak powinno być łatwo zmienić.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak dynamicznie mapować kolumny wejściowe i wyjściowe w SSIS?

  2. Wybór N wierszy w SQL Server

  3. Jak utworzyć niezerowe ograniczenie w kolumnie w tabeli SQL Server — samouczek SQL Server / T-SQL, część 51

  4. Jak grupować według ciągłych zakresów?

  5. Jak sprawić, by rozszerzenie SQLSRV działało z PHP, skoro MSSQL jest przestarzały?