Sql 使用postgres json删除键为空时的行

Sql 使用postgres json删除键为空时的行,sql,json,postgresql-9.4,Sql,Json,Postgresql 9.4,质疑 第(1)行 第(2)行 当章节为空时,如何完全删除该行 我试着用查找章节,其中(books->“chapters”)不是NULL,但它抛出的错误是 “books->unknown”由于用于生成chapters数组的标量子查询技术,您的查询允许书籍没有章节。您总是可以在外部查询中添加一个条件,过滤掉章节数组为空的行,但这只是一种解决方法 我认为最好将内联查询转换为一个join,使用一个聚合查询生成每本书的章节数组。join删除了没有章节的书籍 以下是查询的更新版本(我使用json_build

质疑

第(1)行

第(2)行

当章节为空时,如何完全删除该行

我试着用查找章节,其中(books->“chapters”)不是NULL,但它抛出的错误是
“books->unknown”

由于用于生成
chapters
数组的标量子查询技术,您的查询允许书籍没有章节。您总是可以在外部查询中添加一个条件,过滤掉章节数组为空的行,但这只是一种解决方法

我认为最好将内联查询转换为一个
join
,使用一个聚合查询生成每本书的章节数组。
join
删除了没有章节的书籍

以下是查询的更新版本(我使用json_build_object()
而不是
row_to_json()`来限制嵌套:

{
   "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
      }
   ]
}
{
   "book_id":"c77c049c-d096-472f-a690-b48a9e979d86",
   "book_title":"Ask the Dust",
   "chapters":null
}
{
   "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
      }
   ]
}
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