设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL Server:根据记录的值返回列名

发布时间:2021-02-24 11:24 所属栏目:116 来源:网络整理
导读:基于以下示例表,我希望有人对以下内容提供快速建议/解决方案: |Field1 |Field2 |Field3 |Field4 ||-------|-------|-------|-------|| 1 | 0 | 0 | 1 | 我希望能够构建一个查询来返回列名,其值(基于单个记录)= 1.这样,不依赖于游标或临时表. 即我想要以下输

基于以下示例表,我希望有人对以下内容提供快速建议/解决方案:

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

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

即我想要以下输出:

Field1
Field4

我一直在尝试对sys.columns(和sys.tables)进行各种连接,但到目前为止还没什么用.

解决方法

您也可以使用Cross apply
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,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

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读