如何使用SQL Server搜索列具有特定数据

时间:2018-01-19 03:14:38

标签: sql sql-server

我正在使用SQL Server 2008,而我正在寻找一种查找列名的方法。

v01 | v02 | v03
----+-----+--------
 y  | x   |  y

那是我桌子的样子。

我希望得到v01, v03,因为他们有 y

有没有办法使用SQL获取此功能?

3 个答案:

答案 0 :(得分:1)

您可以使用case并将值连接在一起:

select ((case when v01 = 'y' then 'v01;' else '' end) +
        (case when v02 = 'y' then 'v02;' else '' end) +
        (case when v03 = 'y' then 'v03;' else '' end)
       )

答案 1 :(得分:1)

您可以使用UNPIVOT

DECLARE @MyTable TABLE (v01 varchar(10), v02 varchar(10), v03 varchar(10))
INSERT INTO @MyTable VALUES ( 'y', 'x', 'y')

SELECT Col FROM @MyTable UNPIVOT( Val FOR Col IN ([v01], [v02], [v03])) UNPVT
WHERE Val = 'y'

结果:

Col
-------
v01
v03

答案 2 :(得分:0)

示例数据

IF OBJECT_ID('dbo.Temptable')IS NOT NULL
DROP TABLE Temptable
;WITH cte(
v01 , v02 , v03)
AS
(               
SELECT  'y'  , 'x'   ,  'y'
)
SELECT * INTO Temptable FROM cte

通过使用交叉应用动态sql

IF OBJECT_ID('dbo.Getdata')IS NOT NULL
DROP TABLE Getdata
DECLARE @SqlCoulmn NVARCHAR(max)

SELECT @SqlCoulmn='SELECT'+ STUFF((SELECT DISTINCT ', '+ReqriredCOulmns FROM
(
SELECT 'CASE WHEN '+ COLUMN_NAME+'='+'''Y''' + 'THEN '+COLUMN_NAME  +' ELSE NULL END AS '+COLUMN_NAME AS ReqriredCOulmns
 FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='Temptable'
)dt
FOR XML PATH ('')),1,1,'') +'  INTO Getdata FROM Temptable'

EXEC (@SqlCoulmn)

DECLARE @Sql NVARCHAR(MAX) , @dynCoulmn NVARCHAR(MAX)

SELECT @dynCoulmn=STUFF((SELECT distinct ', '+TempCol  FROM
(
SELECT '('+COLUMN_NAME+','+''''+COLUMN_NAME+''''+')' AS TempCol
 FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='Getdata'
)dt2
FOR XML PATH ('')),1,1,'')

SET @Sql=' 
SELECT Col FROM Getdata
CROSS APPLY ( Values '+@dynCoulmn+'
            ) A (Val,Col)
            WHERE Val IS NOT NULL
'
PRINT @Sql
EXEC (@Sql)

交叉申请前的结果

v01 v02 v03
-----------
y   x   y

交叉申请后的结果

Col
---
v01
v03