我有一个名为X的表格
ID A B C D
1 T T F T
2 F T F T
3 T F T F
如果我的输入是ID=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
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 |
+---+
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
A,B,D
或 B,D
或 C
(用逗号分隔)。@ID
和 @TVal
也是参数。除此之外,你当前的 SQL 语句将无法工作,因为语法不正确。 - Tim Schmelter