如何将列变成行条件

时间:2019-02-12 07:39:54

标签: sql postgresql unpivot

我有一个像这样的列结构:

ID,c1(布尔值),c2(布尔值),c3(布尔值),c4(布尔值)。

在从中读取布尔值时如何将它们转换为行条件?我只想要正确的列。

ID | c1 | c2 | c3 | c4 | c5
107 true true false true false

我只想返回以下内容:

ID | col
1   c1
1   c2
1   c4

我不确定postgres中是否有类似的东西。

2 个答案:

答案 0 :(得分:3)

您可以使用未嵌套的数组:

select id, 'c'||t.idx as col
from the_table
  cross join unnest(array[c1,c2,c3,c4]) with ordinality as t(flag, idx)
where t.flag;

with ordinality返回数组中值的索引。因为它对应于“索引”列,所以我们可以通过在输出中使用它来“重新创建”列名。

在线示例:https://rextester.com/JJHG50564

答案 1 :(得分:2)

我不会为此使用数组。我会简单地做:

select t.id, v.colname
from t cross join lateral
     (values (c1, 'c1'), (c2, 'c2'), (c3, 'c3'), (c4, 'c4'), (c5, 'c5')
     ) v(val, colname)
where v.val;

这使您可以随意命名列。