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

问题描述 投票:0回答:1

查询

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]查找章节,但它引发的错误是'书->未知'

您的查询允许书籍不带章节,因为用于生成chapters数组的标量子查询技术。您总是可以在外部查询中添加一个条件,以过滤掉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
sql json postgresql-9.4
1个回答
0
投票

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

[我认为您最好将内联查询转换为join,并使用汇总查询来生成每本书的章节数组。 join删除没有章节的书籍。

© www.soinside.com 2019 - 2024. All rights reserved.