3

我有一张桌子 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。

我怎样才能列出这些列?

4

3 回答 3

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 |
+---+

SQL小提琴

于 2013-06-04T10:07:43.197 回答
1

您还可以将 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上的演示

于 2013-06-04T11:20:31.730 回答
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
于 2013-06-04T10:08:41.187 回答