Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-查找col';按指定值指定的名称_Sql_Sql Server - Fatal编程技术网

SQL Server-查找col';按指定值指定的名称

SQL Server-查找col';按指定值指定的名称,sql,sql-server,Sql,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| 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中做到这一点?

应该足够了:

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
应该足够了:

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

您可以像下面这样使用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

您可以像下面这样使用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

您应该查找pivot或unpivot在多列中存储相同“类型”数据的可能重复项通常是数据模型损坏的标志-通常伴随着一些数据,而不是作为元数据结束-例如,在这里,您要编写查询的数据已嵌入到列名中。如果可能的话,最好是修复数据模型,以便将所有数据建模为数据。你应该查找pivot或unpivot将同一“类型”的数据存储在多列中的可能重复项通常是数据模型损坏的迹象-通常伴随着一些数据,而不是作为元数据结束-如此处,要编写查询的数据已嵌入到列名中。如果可能,最好修复数据模型,以便将所有数据建模为数据。