基于行值提取列

3

我有一个名为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。
我该如何列出这些列名?
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 Fiddle


所有三个答案都是正确的。我更喜欢这个,因为它可以在每一行上输出结果。不过,添加所有列确实需要一些努力(我们的表有78列)。感谢马丁在SQL Fiddle上进行演示。 - Rohan Bhatte

1
此外,您可以使用强大的FLWOR表达式和XQuery。无论表中包含多少列;)
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上的演示


正如亚历山大所说,列并不重要。唯一的问题是它将所有列都列在一行中,用一个空格分隔的列。感谢您在 SQLFiddle 上进行演示。 - Rohan Bhatte
好的。以下解决方案将解决这个问题。答案已更新。 - Aleksandr Fedorenko

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

但他想要所有可能的组合和单个结果,例如 A,B,DB,DC(用逗号分隔)。@ID@TVal 也是参数。除此之外,你当前的 SQL 语句将无法工作,因为语法不正确。 - Tim Schmelter
@TimSchmelter 这只是一个简单的演示,提供了一种在确保其正常工作之前的方法。请查看更新后的答案。 - Muhammad Hani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接