Сложная задача программирования на T-SQL - PullRequest
1 голос
/ 12 января 2012

У меня сложная проблема программирования в SQL Server 2000, и я надеюсь, что смогу получить помощь.Я новичок в T-SQL (я в основном использую MySQL), так что, возможно, кто-то мог бы взглянуть на это и найти простой способ сделать это.

У меня есть таблица с множеством столбцов, которые содержат 0 или 1. Например, у меня есть столбцы с пометкой var1, var2, var5, var9.и т. д. Всего около 120 столбцов.Обратите внимание, что суффиксы в этих столбцах не обязательно являются последовательными.Каждый из этих столбцов содержит 0 или 1. Что мне нужно сделать, это создать новый столбец, содержащий буквенные имена столбцов каждого столбца, который содержит 1.

Например, мои данные выглядят так:

ID var1   var2   var5    var7   var9
--------------------------------------
1    0      1      0      0       1
2    0      1      1      1       0

Мне нужен новый столбец, который содержит значения

ID  NewCol
---------------------
1   var2,var9
2   var2,var5,var7

и так далее.

По причинам, в которые я не буду вдаваться, я не могу использовать любой код на стороне клиента, такой как VB, Perl и т. Д. Я должен сделать это в хранимой процедуре.Из-за большого количества столбцов, которые могут измениться либо по имени, либо по номеру, мне нужно нечто иное, чем жестко закодированная серия операторов SELECT CASE.

Я чувствую себя действительно ограниченным своими знаниями T-SQL.Можно ли это сделать ??

TIA

1 Ответ

4 голосов
/ 12 января 2012

Вы можете сделать это с помощью запроса, который выглядит следующим образом:

select ID,
       stuff(
       case var1 when 1 then ',var1' else '' end +
       case var2 when 1 then ',var2' else '' end +
       case var5 when 1 then ',var5' else '' end +
       case var7 when 1 then ',var7' else '' end +
       case var9 when 1 then ',var9' else '' end
       , 1, 1, '')
from YourTable

Вот способ построить его динамически.

declare @SQL varchar(8000)
set @SQL = ''

select @SQL = @SQL + ' + case '+COLUMN_NAME+' when 1 then '','+COLUMN_NAME+''' else '''' end'
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = 'YourTable' and
      COLUMN_NAME <> 'ID'

set @SQL = 'select ID, stuff('+stuff(@SQL, 1, 3, '')+', 1, 1, '''') from YourTable'

exec(@SQL)
...