我正在使用SQL Server 2008,而我正在寻找一种查找列名的方法。
v01 | v02 | v03
----+-----+--------
y | x | y
那是我桌子的样子。
我希望得到v01, v03
,因为他们有 y 。
有没有办法使用SQL获取此功能?
答案 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