我希望有人根据以下示例表对以下问题提出快速建议/解决方案:
|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/