Можем да използваме няколко трика:
- За да пропуснете
NULL
стойности:COALESCE() - За да избегнете завършващ разделител:добавете го преди всеки елемент, премахнете първия след това с напр. STUFF()
Той е работещ пример :
СЪЗДАВАНЕ НА ТАБЛИЦА foo ( id INT IDENTITY(1, 1) НЕ NULL, a VARCHAR(50), b VARCHAR(50), c VARCHAR(50), d VARCHAR(50), ПЪРВИЧЕН КЛЮЧ (id) );ВМЪКНЕТЕ В foo (a, b, c, d) СТОЙНОСТИ ('a', 'b', 'c', 'd');INSERT INTO foo (a, b, c, d) СТОЙНОСТИ (NULL, ' b', NULL, 'd');INSERT INTO foo (a, b, c, d) СТОЙНОСТИ ('a', NULL, NULL, 'd'); INSERT INTO foo (a, b, c, d) СТОЙНОСТИ (NULL, NULL, NULL, NULL);
ИЗБЕРЕТЕ идентификатор,STUFF( COALESCE('; ' + a, '') + COALESCE('; ' + b, '') + COALESCE('; ' + c, '') + COALESCE('; ' + d, ''),1, 2, '') КАТО barFROM fooORDER BY id
<предварителен код>| ID | БАР ||----|------------|| 1 | а; b; ° С; г || 2 | b; г || 3 | а; г || 4 | (нула) |
Целта на STUFF(..., 1, 2, '')
е да премахнете първоначалния разделител (2
е дължината на разделителя в нашия случай).
Това трябва да работи на SQL Server 2005 (и вероятно по-ранни версии).
Забележка:за разлика от оригиналния CONCAT_WS()
, нашата версия връща NULL
когато всички елементи са NULL
. Честно казано мисля, че е по-добър избор, но така или иначе трябва да е лесно да се промени.