【问题标题】:Removing row when a key is empty with postgres json使用postgres json当键为空时删除行
【发布时间】:2020-01-01 16:55:19
【问题描述】:

查询

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 的章节,但它抛出的错误是 '书 -> 未知'

【问题讨论】:

    标签: sql json postgresql-9.4


    【解决方案1】:

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

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

    这是您查询的更新版本(我使用 json_build_object()rather thanrow_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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 2012-11-08
      • 2013-03-06
      • 2014-02-09
      • 1970-01-01
      相关资源
      最近更新 更多