sql >> Databáze >  >> RDS >> Sqlserver

CONCAT_WS() pro SQL Server

Můžeme použít několik triků:

  • Přeskočit NULL hodnoty:COALESCE()
  • Abyste se vyhnuli koncovému oddělovači:přidejte jej před každou položku, první odstraňte poté, např. STUFF()

Je to pracovní příklad :

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

Účel STUFF(..., 1, 2, '') je odstranit počáteční oddělovač (2 je v našem případě délka oddělovače).

To by mělo fungovat na SQL Server 2005 (a možná na dřívějších verzích).

Poznámka:na rozdíl od původního CONCAT_WS() , naše verze vrací NULL když jsou všechny položky NULL . Upřímně si myslím, že je to lepší volba, ale stejně by to mělo být snadné změnit.



  1. Jak efektivně používat index v dotazu mysql

  2. Existuje způsob, jak zobrazit klauzuli WHERE pouze pro jedno pole v MySQL?

  3. MySQL efektivně kopíruje všechny záznamy z jedné tabulky do druhé

  4. Propojte metabázi s MySQL pro průzkum dat