循环遍历列SQL

时间:2009-03-30 14:08:12

标签: sql sql-server csv loops

我正在寻找一种循环表格列的方法来生成输出,如下所述。

表格如下:

ID  Name     OPTION1 OPTION2 OPTION3 OPTION4 OPTION5
1   MyName1  1       0       1       1       0
2   MyName2  0       0       1       0       0

输出看起来像那样:

MyName1 -> OPTION1, OPTION3, OPTION4
MyName2 -> OPTION3

任何执行此操作的方向都将非常感激。否则,我想我将不得不使用游标或临时表...数据库引擎是MSSQL。我在数据库级别进行格式化的原因是将其输出提供给有限的可编程环境。

更新:输出可以通过任何形式,一串或多行字符串。

更新:是否可以通过使用@str = @str + ...构建字符串来实现这一目标?

更新:我更改了输出...这应该更容易。

谢谢!

6 个答案:

答案 0 :(得分:4)

你可能想看一下PIVOT Tables。

答案 1 :(得分:4)

好吧,如果列数已知,您可以这样做:

SELECT  
  MyName + " ->"
  + case OPTION1 when 1 then ' OPTION1' else '' end
  + case OPTION2 when 1 then ' OPTION2' else '' end
  + ...
FROM
 Table

如果在创建查询时列未知 - 我可能仍然会使用一些动态创建的SQL。优点是代码可能做你想要的,而且非常简单。

答案 2 :(得分:2)

您可以使用系统目录构建动态语句:

http://msdn.microsoft.com/en-us/library/ms189082.aspx

答案 3 :(得分:2)

既然你没有考虑到为什么你希望能够做到这一点的特定需求,我无法确定,但通常当我看到这类问题时,我会想到两件事:

  1. 您需要规范化数据库。也许“Option1”,“Option2”等没有任何共同之处,但也很有可能它们是你桌子中的重复组。

  2. 处理应用程序显示层的显示问题 - 即前端,而不是数据库。

  3. 正如我所说,也许这些因某些特定原因不适用于您的情况,但似乎是我从您的问题中读到的。

答案 4 :(得分:1)

如果使用数据透视表,则必须确保所有“选项”列具有相同的数据类型和长度。

我建议以下答案:


IF NOT EXISTS( SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME      
 = 'TABLE1' ) 
create table table1
(
   name nvarchar(50),       
   colvalue nvarchar(50)
)
else
  truncate table table1

declare @table nvarchar(50)
set @table = 'yourtable'

declare @column table
(
   ID integer identity,
   colname nvarchar(20)
)


insert into @column
SELECT c.name FROM sys.tables t 
JOIN sys.columns c ON t.Object_ID = c.Object_ID 
WHERE t.Name = @table 
and c.name in ('Option1','Option2','Option3','Option4','Option5')

declare @minID integer, @maxID integer
declare @cmd nvarchar(max)  
declare @col nvarchar(20)
declare @SQLStr nvarchar(max)

select @minID = MIN(ID), @maxID= MAX(ID)
from @column

while @minID <= @maxID
begin
    select @col = colname
    from @column
    where ID = @minID

    set @SQLStr =    
    'insert into table1 (name, colvalue)
    select name,' + @col + '
    from ' + @table + ' 
    where ' + @col + ' <> 0'    

    exec(@SQLStr)

    set @minID = @minID + 1
end

select distinct name, STUFF(
(SELECT  ',' + a.colvalue  AS [text()]
from Table1  a
where a.name = b.name
Order by a.colvalue
for xml PATH('')),1,1,''    ) AS Comments_Concatenated
from Table1 b
group by name, colvalue
ORDER BY name

你只需要输入你的表名,然后在inslec进入@column之前输入你需要的列的列表来修改@table。

无论您使用何种数据类型,它都能正常运行。

答案 5 :(得分:0)