2016-07-25 55 views
1

我有幾列指定名稱。我需要選擇列的名稱,其中是指定的值。SQL Server - 按指定值查找列的名稱

例子:

----------------------------------- 
id| a col | b col | c col | d col | 
----------------------------------- 
1 | N | N | A | N | 
2 | A | N | N | N | 
3 | N | A | N | N | 

我需要得到像導致

-------------------- 
id | column's name | 
-------------------- 
1 |  c col  | 
2 |  a col  | 
3 |  b col  | 

有表的列多,所以我需要指定應該用於此列。我如何在SQL Server 2014中做到這一點?

+2

ü應該仰望轉動或逆轉置https://開頭的TechNet .microsoft.com/nl-nl/library/ms177410(v = sql.105).aspx – lordkain

+0

[SQL Server:retu列名基於記錄的值](http://stackoverflow.com/questions/27285569/sql-server-return-column-names-based-on-a-records-value) – Lijo

+0

存儲相同的「類型」的多列中的數據通常是數據模型中斷的標誌 - 通常伴隨着一些*數據*,而不是結尾爲*元數據* - 例如這裏,您希望編寫查詢的數據已經嵌入列*名稱中*。如果可能的話,將會更好,修復數據模型,以便將所有數據建模爲*數據*。 –

回答

0

UNPIVOT應該足夠:

SELECT id, 
     col 
FROM (
    SELECT * 
    FROM YourTable 
    ) as p 
UNPIVOT (
    [value] FOR col IN ([a col], [b col], [c col], [d col]) 
) as unpvt 
WHERE [value] = 'A' 

輸出:

id col 
1 c col 
2 a col 
3 b col 
0

您可以使用UNPIVOT查詢像下面

declare @q varchar(max) 
set @q='select id,columnname from '+ 
'(select id,columnname,data from '+ 
'(select * from tablename)t '+ 
'UNPIVOT '+ 
'(data for columnname in ('+ 
stuff((select ',['+c.name +'] ' from sys.columns c join sys.tables t 
on c.object_id=t.object_id and t.name like 'tablename' FOR XML PATH('')),1,1,'') 
+')) u)t where data like ''A''' 
exec @q