我有一张桌子 X
ID A B C D
1 T T F T
2 F T F T
3 T F T F
因此,如果我的 ID 输入为 1,那么我想要第 1 行值为 T 的所有列名。在上述情况下,A、B、D 或如果 ID 为 3,则 A 和 C。
我怎样才能列出这些列?
我有一张桌子 X
ID A B C D
1 T T F T
2 F T F T
3 T F T F
因此,如果我的 ID 输入为 1,那么我想要第 1 行值为 T 的所有列名。在上述情况下,A、B、D 或如果 ID 为 3,则 A 和 C。
我怎样才能列出这些列?
你可以用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 |
+---+
您还可以将 XQuery 与强大的 FLWOR 表达式一起使用。而且无论有多少列包含一个表;)
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上的演示
如果您知道所有列的编号和名称,您可以执行以下操作
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