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

标签 sql sql-server

我希望有人根据以下示例表对以下问题提出快速建议/解决方案:

|Field1 |Field2 |Field3 |Field4 |
|-------|-------|-------|-------|
| 1     | 0     | 0     | 1     |

我希望能够构建一个查询来返回列名,其中列名的值(基于单个记录)= 1。这不需要依赖游标或临时表。

即我想要以下输出:

Field1
Field4

我一直在尝试对sys.columns(和sys.tables)进行各种连接,但到目前为止收效甚微。

最佳答案

您还可以使用交叉应用

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

要动态工作,请使用它。

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 

关于SQL Server : return column names based on a record's value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27285569/

相关文章:

c# - 如何将 TimeSpan 值以 "d.hh:mm:ss"格式保存在数据库中?

sql-server - 如何在SQL Server中使用触发器将记录从一个表插入到另一个表?

sql - SQL Server 中的聚合函数

c# - 将列数据存储为行 MS SQL 的最佳方法

sql - ParseException - 子查询源中的输入不匹配 - Hive 中的错误

mysql - 左连接是否可以表示为右连接,反之亦然?

sql - 如何使用 Golang 在 SQL 中执行 IN 查找?

php - mysql:ROLLUP on TOP,SUM(FINANCIAL AMOUNT),然后按DATETIME DESC排序FINANCIAL AMOUNT列

PHP mysql如何关联三个表显示不同表的输出

sql-server - 更改在 SQL Server 2008 R2 中复制的表