sql - 使用postgres json当键为空时删除行
问题描述
询问
select row_to_json(t)
from (
select book_id, book_title,
(
select array_to_json(array_agg(row_to_json(d)))
from (
select chapter_id, chapter_title, chapter_number
from chapters
where chapters.book_id = books.book_id
ORDER BY chapter_number
) d
) as chapters
from books
) t
行 (1)
{
"book_id":"c77c049c-d096-472f-a690-b48a9e979d86",
"book_title":"Ask the Dust",
"chapters":null
}
行 (2)
{
"book_id":"4a7cfa6d-573a-4fda-9258-8800fa217f4e",
"book_title":"Before I Self Destruct",
"chapters":[
{
"chapter_id":"8e2ac988-3d48-489d-a81a-745536da7164",
"chapter_title":"Sunshine Cleaning",
"chapter_number":1
}
]
}
当章节为空时,如何完全删除该行?
我尝试使用WHERE (books->'chapters') IS NOT NULL查找章节,但它抛出的错误是 'books -> unknown'
解决方案
由于用于生成chapters
数组的标量子查询技术,您的查询允许没有章节的书籍。您始终可以在外部查询中添加一个条件,以过滤掉章节数组为空的行,但这只是一种解决方法。
我认为您最好将内联查询转换为join
带有聚合查询的聚合查询,该查询生成每本书的章节数组。消除了没有章节的join
书籍。
这是您查询的更新版本(我使用 json_build_object() rather than
row_to_json()` 来限制嵌套:
select
json_build_object(
'book_id', b.book_id,
'book_title', b.book_title,
'chapters', c.chapters
) res
from books b
inner join (
select
book_id,
json_agg(
json_build_object(
'chapter_id', chapter_id,
'chapter_title', chapter_title,
'chapter_number', chapter_number
)
order by chapter_number
) chapters
from chapters
group by book_id
) c on c.book_id = c.book_id
推荐阅读
- mysql - 应用错误 1677:表“sales_orders”的第 59 列无法从“datetime”类型转换为“varchar(10)”类型
- angular - 在 index.html 中重复根标签
- javascript - VusJs:渲染错误:“类型错误:无法读取未定义的属性‘数据’”
- c++ - Windows ACL 和 ACCESS_MASK
- angular - 如何在 Angular 4 中创建从应用程序组件页面到其他页面的导航链接?
- c - 填充整数数组与填充浮点数组相同吗?
- docker - 使用 Let's Encrypt 和 Docker 加密 R Plumber API
- c# - FindControl() 搜索动态控件时返回 null
- javascript - 配置文件图片未跨组件更新Angular 5
- sed - 只有在前面匹配时才执行剩余的命令