いくつかのトリックを使用できます:
-
NULL
をスキップするには 値: COALESCE() - 末尾の区切り文字を避けるには:すべてのアイテムの前に区切り文字を追加し、後で最初の区切り文字を削除します。 STUFF()
彼は
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) |
STUFF(..., 1, 2, '')
の目的 最初の区切り文字(2
)を削除することです この場合のセパレータの長さです。
これはSQLServer2005(および場合によっては以前のバージョン)で機能するはずです。
注:元のCONCAT_WS()
とは異なります 、私たちのバージョンはNULL
を返します すべてのアイテムがNULL
の場合 。正直なところ、それがより良い選択だと思いますが、とにかく簡単に変更できるはずです。