代码之家  ›  专栏  ›  技术社区  ›  Wadih M.

循环遍历SQL列

  •  5
  • Wadih M.  · 技术社区  · 17 年前

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

    该表如下所示:

    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
    

    使现代化 :输出可以是任何形式的字符串或字符串行。

    使现代化 :通过使用@str=@str+…,构建一个字符串,是否可以实现这一点?

    使现代化

    谢谢

    6 回复  |  直到 17 年前
        1
  •  4
  •   user76035    17 年前

    如果列数已知,可以执行以下操作:

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

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

        2
  •  3
  •   John Boker    17 年前

    您可能想看看透视表。

        3
  •  2
  •   Tom H zenazn    17 年前

    因为你没有深入到为什么你想这样做的具体需求,我不能确定,但通常当我看到这种问题时,我会想到两件事:

    1. 您需要规范化您的数据库。也许“选项1”、“选项2”等没有共同之处,但它们也很有可能是您表中的重复组。

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

    正如我所说的,也许由于某些特定的原因,这些不适用于你的情况,但从我读到的你的问题来看,似乎是这样的。

        5
  •  1
  •   Andrew Barber Eric Lafortune    13 年前

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

    我建议以下答案:


    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
    

    在插入@column之前,只需通过输入表名和所需列的列表来修改@table。

    无论您是什么数据类型,它都可以正常工作。