我有一张桌子X
ID A B C D
1 T T F T
2 F T F T
3 T F T F
因此,如果我的输入为1表示ID,那么我希望所有列名称的值都为第1行。在上述情况A,B,D或如果ID为3,则为A和C.
我如何列出这些列?
答案 0 :(得分:3)
您可以将UNPIVOT
用于此
SELECT Y
FROM Table1
UNPIVOT (X FOR Y IN ([A], [B], [C], [D])) U
WHERE [ID] = 1 AND X = 'T'
返回
+---+
| Y |
+---+
| A |
| B |
| D |
+---+
答案 1 :(得分:1)
此外,您可以将XQuery与强大的FLWOR Expression结合使用。并且无论有多少列包含表;)
SELECT(
SELECT *
FROM Table1 t
WHERE ID = 1
FOR XML PATH(''), TYPE
).query(
'for $spec in ./*
where $spec [contains(., "T")]
return fn:local-name($spec)'
) o
SQLFiddle上的演示
此决定返回每行的列名
SELECT o.TCols.value('.', 'nvarchar(100)') AS T
FROM(SELECT(
SELECT *
FROM Table1 t
WHERE ID = 1
FOR XML PATH(''), TYPE
).query('
for $spec in ./*
where $spec [contains(., "T")]
return (
<TCols>
{fn:local-name($spec)}
</TCols>
)
')) t(TCols) CROSS APPLY T.TCols.nodes('/TCols') o(TCols)
结果
+---+
| T |
+---+
| A |
| B |
| D |
+---+
SQLFiddle上的演示
答案 2 :(得分:0)
如果您知道所有列的编号和名称,可以执行以下操作
SELECT case A when 'T' then 'A' else '' end
+ case B when 'T' then ',B' else '' end
+ case C when 'T' then ',C' else '' end
+ case D when 'T' then ',D' else '' end
FROM
Table1
WHERE ID = 1