Reputation: 33
I'm using SQL Server 2008 and I'm looking for a way to find column name.
v01 | v02 | v03
----+-----+--------
y | x | y
That's how my table looks.
And I want to get v01, v03
because they have y.
Is there any way to get this using SQL?
Upvotes: 1
Views: 76
Reputation: 2516
Sample data
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
By Using cross apply with dynamic 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)
Result Before Cross apply
v01 v02 v03
-----------
y x y
Result after Cross apply
Col
---
v01
v03
Upvotes: 0
Reputation: 13393
You can use 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'
Result:
Col
-------
v01
v03
Upvotes: 1
Reputation: 1269623
You can use case
and concatenate the values together:
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)
)
Upvotes: 1