postgresql - 为什么 jsonb_path_query 缺少某些行的值?
问题描述
我有这个jsonb
我正在尝试展平并迁移到conversations
表格tags
:
{
id: '1',
type: 'conversation',
tags: [
{
id: '1',
type: 'tag',
name: 'foo'
}, {
id: '2',
type: 'tag',
name: 'bar'
},
{
id: '3',
type: 'tag',
name: 'baz'
}
]
}
但以下查询返回意外结果:
SELECT
jsonb_path_query(payload, '$.id') #>> '{}' conversation_id,
jsonb_path_query(payload, '$.tags[*].name') tag_name
FROM conversations;
conversation_id | tag_name
1 foo
bar
baz
我想要以下内容
conversation_id | tag_name
1 foo
1 bar
1 baz
我可能遗漏了一些明显的东西,但我不清楚:
- 为什么
conversation_id
是NULL
第二排和第三排。 - 如何在不解析两遍的情况下获得我想要的结果
jsonb
。
解决方案
这就是自 v10 以来选择列表中的多个集合返回函数的工作方式。见不启动“在 PostgreSQL 10 之前,放置多个集合返回函数”
您的查询可以转换为更简单的:
SELECT
payload #>> '{id}' conversation_id,
jsonb_path_query(payload, '$.tags[*].name') tag_name
FROM conversations;
推荐阅读
- ruby-on-rails - 根据 Rails 条件返回设计错误
- f# - 使用 TPL 的代码是否有更 F# 的惯用方式?
- python - Pandas:根据其他列的用户输入值进行过滤
- python - 剥离基于 python 的项目构建的共享库的最简单方法是什么?
- php - 我需要使用第三方在 Google Cloud Instance 中使用 php 邮件功能吗?
- java - 创建 n 个线程
- angular - 为什么 Angular 模板中的这个传统 HTML 表单不能提交?
- javascript - JS 中的箭头和词法范围
- javascript - d3 力图中的链接距离不正确
- dependency-injection - 如何使用依赖注入在 Elixir 中注入 IO.gets 输入?