Используйте like
и case
:
select column1,
(case when ',' + column1 + ',' like '%,a,%' then 'x' end) as a,
(case when ',' + column1 + ',' like '%,b,%' then 'x' end) as b,
(case when ',' + column1 + ',' like '%,c,%' then 'x' end) as c,
(case when ',' + column1 + ',' like '%,d,%' then 'x' end) as d,
(case when ',' + column1 + ',' like '%,e,%' then 'x' end) as e,
(case when ',' + column1 + ',' like '%,f,%' then 'x' end) as f
from t;
Я не уверен, почему необходим «Dynami c». Проблема не в исходных строках, а в целевых столбцах. Если вам нужно, чтобы они соответствовали исходным строкам, тогда вам нужно использовать Dynami c SQL. , , и это кажется довольно сложным.
РЕДАКТИРОВАТЬ:
Сердце динамического c SQL объединяет выражения case
. Вы можете сделать это, используя string_split()
и string_agg()
(или эквивалентные функции в более старых версиях SQL Server):
select string_agg(replace(' (case when '','' + column1 + '','' like ''%,[value],%'' then ''x'' end) as [value]', '[value]', value), '
'
) within group (order by value) as cols
from (select distinct value
from t cross apply
string_split(t.column1, ',')
) t
Здесь - это db <> fiddle.
Я позволю вам составить остальную часть запроса.