Объединить столбцы в запросе select и добавить запятую, если значение не равно NULL - PullRequest
0 голосов
/ 19 марта 2020

У меня на главном столе и 10 левых объединений со второй таблицей:

SELECT a.*, f1.Name + ',' + f2.Name + ',' ...
[dbo].[tblStep] a (nolock)
left join OPStep_Flag (nolock) sf1  ON sf1.StepId = a.StepId
left join OPFlag f1 (nolock) ON f1.Id = sf1.FlagId AND f1.Id = 1
left join OPStep_Flag sf2 (nolock) ON sf2.StepId = a.StepId
left join OPFlag f2 (nolock) ON f2.Id = sf2.FlagId AND f2.Id = 3
left join ...

А теперь проблема с запятыми, потому что если f1.Name будет нулевым, в результате я получу ', ааа' .

Как избежать печати запятых, если любой из флагов равен нулю?

Ответы [ 3 ]

0 голосов
/ 19 марта 2020

Начиная с SQL Server 2017, вы можете использовать concat_ws():

CONCAT_WS игнорирует нулевые значения во время конкатенации и не добавляет разделитель между нулевыми значениями , Следовательно, CONCAT_WS может чисто обрабатывать конкатенацию строк, которые могут иметь «пустые» значения

concat_ws(',', f1.Name, f2.Name, ...)
0 голосов
/ 20 марта 2020

Вот как мы это делаем на заводе

ВЫБРАТЬ КОНВЕРТ (NVARCHAR, L.COLUMN1) + ',' AS [data ()] ИЗ ТАБЛИЦЫ 1 l ДЛЯ XML ПУТЬ ('')

0 голосов
/ 19 марта 2020

Если 2012-2016 ... Concat() будет обрабатывать NULL значения как пустые строки

stuff( concat( ','+f1.Name , ','+f2.Name , ','+f3.Name ) ,1,1,'')

Так, например, обратите внимание, что среднее значение будет нулевым

Select stuff(concat( ','+'John' , ','+null , ','+'Smith' ),1,1,'')

Возвращает

John,Smith
...