小编Tim*_*Tim的帖子

字段名称中的 json_object_agg 错误为 null

PostgreSQL 版本:我的本地安装是 11.3,下面的小提琴是 10.0。两者的行为相同。

我有一个页面架构,每个页面都有部分,每个部分可以有不同类型的内容。当我查询某个页面时,我希望在 JSON 文档中输出有关该页面的所有信息。

我将 CTE 用于json_agg()每个部分的各种内容。最后,我将各个部分连接起来json_object_agg(),将部分标题映射到部分内容。

问题: json_object_agg()当页面没有任何部分时抛出错误。我已经通过使用没有章节标题的常规来验证有罪json_agg()。确切的错误:

error: field name must not be null
Run Code Online (Sandbox Code Playgroud)

我想要的:无论如何都不是错误。我不想在接收方进行自定义错误处理。如果查询可以返回 JSONNull来代替json_object_agg()没有部分的情况,那就更好了,但这是可选的。(欢迎其他优雅的解决方案)

文档

可能文档不完整或者我遗漏了一些东西。仅供参考。

聚合表达式上它说(强调我的):

大多数聚合函数都会忽略 null 输入,因此一个或多个表达式产生null 的行将被丢弃。除非另有说明,对于所有内置聚合,这可以 假定为 true 。

聚合函数中,json_object_agg()没有评论不处理null

将名称/值对聚合为 JSON 对象

摆弄错误的域参数。将域更改为其他选项可以使其正常工作。使用不存在的域也可以正常工作并返回 0 行。

询问

with secs as (
    select p.page_id, p.domain, s.section_id as sid, s.title as title
    from pages p
    left …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate json postgresql-10 postgresql-11

7
推荐指数
1
解决办法
1万
查看次数

在并行事务中使用相同的临时表名是否安全?

使用 postgreSQL 10 或 11,创建具有相同名称的临时表是否安全,每个表都携带不同的数据?我不打算在任何会话/连接/交易之间共享数据。名称本身并不重要,但我想避免为每个需要此类中间表的并发查询生成随机名称的麻烦。

临时表仅用于不同的SELECT查询。它将在每个带有该ON COMMIT DROP子句的事务结束时删除。

PostgreSQL文档说明:

当临时表存在时,具有相同名称的现有永久表对当前会话不可见,除非它们被模式限定名称引用。

我不清楚这是否也适用于临时表。

postgresql transaction temporary-tables postgresql-10 postgresql-11

4
推荐指数
1
解决办法
807
查看次数