对于SQL Server 2012可以简化接受的答案用单CONCAT
更换的COALESCE
过多:
WITH tests(a, b, c, d) AS (
SELECT NULL, NULL, NULL, NULL UNION
SELECT NULL, NULL, NULL, 'd' UNION
SELECT NULL, NULL, 'c', NULL UNION
SELECT NULL, NULL, 'c', 'd' UNION
SELECT NULL, 'b', NULL, NULL UNION
SELECT NULL, 'b', NULL, 'd' UNION
SELECT NULL, 'b', 'c', NULL UNION
SELECT NULL, 'b', 'c', 'd' UNION
SELECT 'a', NULL, NULL, NULL UNION
SELECT 'a', NULL, NULL, 'd' UNION
SELECT 'a', NULL, 'c', NULL UNION
SELECT 'a', NULL, 'c', 'd' UNION
SELECT 'a', 'b', NULL, NULL UNION
SELECT 'a', 'b', NULL, 'd' UNION
SELECT 'a', 'b', 'c', NULL UNION
SELECT 'a', 'b', 'c', 'd'
)
SELECT a, b, c, d,
STUFF(CONCAT(
'; ' + a,
'; ' + b,
'; ' + c,
'; ' + d
), 1, 2, '') AS cat
FROM tests
a | b | c | d | cat
-----+------+------+------+-----------
NULL | NULL | NULL | NULL | NULL
NULL | NULL | NULL | d | d
NULL | NULL | c | NULL | c
NULL | NULL | c | d | c; d
NULL | b | NULL | NULL | b
NULL | b | NULL | d | b; d
NULL | b | c | NULL | b; c
NULL | b | c | d | b; c; d
a | NULL | NULL | NULL | a
a | NULL | NULL | d | a; d
a | NULL | c | NULL | a; c
a | NULL | c | d | a; c; d
a | b | NULL | NULL | a; b
a | b | NULL | d | a; b; d
a | b | c | NULL | a; b; c
a | b | c | d | a; b; c; d
我为了回答这个问题我自己,使信息提供给任何人问过这个问题。 (对不起,如果已经有一个适当的问题,我找不到。)我会很乐意通过更好的提示upvote /接受其他答案。 –