我希望有人根据以下示例表对以下内容提供快速的建议/解决方案:
|Field1 |Field2 |Field3 |Field4 | |-------|-------|-------|-------| | 1 | 0 | 0 | 1 |
我希望能够建立一个查询来返回其名称(基于单个记录)= 1的列名称。这无需依赖游标或临时表。
即我想要以下输出:
Field1 Field4
我一直在尝试对sys.columns(和sys.tables)进行各种联接,但到目前为止收效甚微。
sys.columns
sys.tables
您也可以使用 Cross apply
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,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