sql >> Database >  >> RDS >> Sqlserver

CONCAT_WS() voor SQL Server

We kunnen een paar trucjes gebruiken:

Hij is een werkend voorbeeld :

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

Het doel van STUFF(..., 1, 2, '') is om het eerste scheidingsteken te verwijderen (2 is de lengte van het scheidingsteken in ons geval).

Dit zou moeten werken op SQL Server 2005 (en mogelijk eerdere versies).

Opmerking:in tegenstelling tot de originele CONCAT_WS() , onze versie retourneert NULL wanneer alle items NULL zijn . Ik denk eerlijk gezegd dat het een betere keuze is, maar het moet toch gemakkelijk te veranderen zijn.



  1. Hoe bepaal je programmatisch welke SQL-tabellen een identiteitskolom hebben?

  2. Hibernate-relatietoewijzing/Batch-inserts versnellen

  3. Welke methoden kunnen worden gebruikt om verschillende versies van reeds bestaande databases te beheren?

  4. SqlDataAdapter.Fill-methode traag