SQL Server : return column names based on a record's value

前端 未结 2 1202
无人及你
无人及你 2020-12-11 18:47

I\'m hoping someone has a quick suggestion/solution to the following, based on the following sample table:

|Field1 |Field2 |Field3 |Field4 |
|-------|-------         


        
相关标签:
2条回答
  • 2020-12-11 19:28

    You can also use Cross apply

    SELECT Cname
    FROM   Tablename
           CROSS apply (VALUES('Field1',Field1),
                              ('Field2',Field2),
                              ('Field3',Field3),
                              ('Field4',Field4)) ca (cname, data)
    WHERE  data = 1 
    

    To work dynamically use this.

    CREATE TABLE test
      (
         Field1 INT,
         Field2 INT,
         Field3 INT,
         Field4 INT
      )
    
    INSERT INTO test
    VALUES      ( 1,0,0,1 )
    
    DECLARE @collist VARCHAR(max)='',
            @sql     NVARCHAR(max)
    
    SELECT @collist += '(''' + COLUMN_NAME + ''',' + COLUMN_NAME + '),'
    FROM   INFORMATION_SCHEMA.columns
    WHERE  TABLE_NAME = 'test'
           AND COLUMN_NAME LIKE 'Field%'
           AND TABLE_SCHEMA = 'dbo'
    
    SELECT @collist = LEFT(@collist, Len(@collist) - 1)
    
    SET @sql ='
    SELECT Cname
    FROM   test
           CROSS apply (VALUES' + @collist
              + ') ca (cname, data)
    WHERE  data = 1 '
    
    EXEC Sp_executesql
      @sql 
    
    0 讨论(0)
  • 2020-12-11 19:42

    You can do this using union all, for instance:

    select 'Field1' from table t where Field1 = 1 union all
    select 'Field2' from table t where Field2 = 1 union all
    select 'Field3' from table t where Field3 = 1 union all
    select 'Field4' from table t where Field4 = 1;
    
    0 讨论(0)
提交回复
热议问题