我有 , , 等列role1
。role2
它们role3
都是布尔值。
我想在这个表上创建一个视图,它的角色列类型为text[]
。如果列是TRUE, FALSE, TRUE
,则视图将包含["role1", "role3"]
.
有什么好的方法可以做到这一点不会爆炸成吨CASE WHEN
吗?为了澄清,我可以使用 O(n) with CASE WHEN
,但不是 O(2^n) ,这是它目前似乎需要的。:)
我有 , , 等列role1
。role2
它们role3
都是布尔值。
我想在这个表上创建一个视图,它的角色列类型为text[]
。如果列是TRUE, FALSE, TRUE
,则视图将包含["role1", "role3"]
.
有什么好的方法可以做到这一点不会爆炸成吨CASE WHEN
吗?为了澄清,我可以使用 O(n) with CASE WHEN
,但不是 O(2^n) ,这是它目前似乎需要的。:)
您可以将该行转换为 JSON 值,然后使用子选择:
我建议
VALUES
在横向子查询中使用表达式。这将列“反透视”为行,因此我们可以处理一组而不是一行。
正如a_horse 所展示的,
json
(b
) 的通用性足以涵盖这项任务。在处理所有列时,您无需拼出符合条件的列boolean
。但似乎无论如何您都必须拼出符合条件的列。细微的差别:这会为“无限定值”(
{}
) 返回一个空数组,而 a_horse 的查询返回NULL
相同的结果。由于三个原因,这应该会更快:
array_agg()
. 看:或者,更简单:用 .
CASE
连接的普通表达式concat_ws()
。如果字符串足够好:应该是最快的解决方案。并没有那么冗长。看:
或者得到与上面相同的数组:
我们还可以从系统目录中动态生成符合条件的列列表。(如果您毕竟不想拼出列。)
或者缩小到
json
(b
) 技术的合格列,以及早消除可能昂贵的噪音。看:db<>fiddle here - 包括。以上所有内容,a_horse 的 jsonb 查询,以及几个变体