sql >> Databasteknik >  >> RDS >> Sqlserver

CONCAT_WS() för SQL Server

Vi kan använda ett par knep:

  • För att hoppa över NULL värden:COALESCE()
  • För att undvika efterföljande separator:lägg till den före varje artikel, ta bort den första efteråt med t.ex. STUFF()

Han är ett fungerande exempel :

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

Syftet med STUFF(..., 1, 2, '') är att ta bort den initiala avgränsaren (2 är separatorlängden i vårt fall).

Detta bör fungera på SQL Server 2005 (och möjligen tidigare versioner).

Obs:till skillnad från originalet CONCAT_WS() , returnerar vår version NULL när alla objekt är NULL . Jag tycker ärligt talat att det är ett bättre val men det borde vara lätt att ändra ändå.



  1. MySQL Cast som Boolean

  2. Ett par snabba saker om PASS-feedback

  3. MySQL och Check Constraints

  4. Min DBA är sjuk - Databas Failover Tips för SysAdmins