如何将列变成行条件
How to turn columns into row condition
我的列结构如下:
ID、c1(布尔值)、c2(布尔值)、c3(布尔值)、c4(布尔值)。
如何在读取布尔值时将它们转换为行条件?我只想要真实的列。
即
ID | c1 | c2 | c3 | c4 | c5
107 true true false true false
我只想 return 这样的事情:
ID | col
1 c1
1 c2
1 c4
我不确定 postgres 中是否有类似的东西。
您可以使用未嵌套的数组:
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
returns 数组中值的索引。由于它对应于列 "index",我们可以 "re-create" 在输出中使用列名。
我不会为此使用数组。我会简单地做:
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;
这允许您随意命名列。
我的列结构如下:
ID、c1(布尔值)、c2(布尔值)、c3(布尔值)、c4(布尔值)。
如何在读取布尔值时将它们转换为行条件?我只想要真实的列。
即
ID | c1 | c2 | c3 | c4 | c5
107 true true false true false
我只想 return 这样的事情:
ID | col
1 c1
1 c2
1 c4
我不确定 postgres 中是否有类似的东西。
您可以使用未嵌套的数组:
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
returns 数组中值的索引。由于它对应于列 "index",我们可以 "re-create" 在输出中使用列名。
我不会为此使用数组。我会简单地做:
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;
这允许您随意命名列。