sql - 使用 json_agg 从 SQL 查询获取 [null] 响应

标签 sql postgresql aggregate-functions coalesce aggregate-filter

仍在学习 SQL/PostgreSQL。我正在努力弄清楚如何停止返回带有 null 值的数组 [null] 而只是返回一个空数组。

COALESCE(
  json_agg(
    CASE 
      WHEN socials.id IS NULL THEN NULL 
      ELSE json_build_object('id', socials.id, 'name', socials.social_id, 'url', socials.url)
    END
  ), '[]'
) AS socials

我错过了什么或做错了什么?据我了解,COALESCE 用于基本上替换返回值为 null/false 的情况。我这样想有错吗?另外我的 SQL 查询可能存在什么问题?

最佳答案

外部 COALESCE 不会执行您想要的操作,因为 json_agg() 永远不会返回 null,除非没有输入行符合条件。并且 COALESCE 仅在 null 输入时起作用 - 不像您那样 null/false把它! (包含单个 null 值作为数组元素的数组与 null 不同!)

改用聚合 FILTER 子句:

SELECT COALESCE(json_agg(json_build_object('id', socials.id, 'name', socials.social_id, 'url', socials.url))
                FILTER (WHERE socials.id IS NOT NULL)
              , '[]') AS socials

现在COALESCE 是有意义的,因为您可以获得结果行,但添加的 FILTER 子句可以使 >json_agg() null.

根据您未公开的查询,您可以添加外部 WHERE 子句:

SELECT json_agg(json_build_object('id', socials.id, 'name', socials.social_id, 'url', socials.url)) AS socials
FROM   ...
WHERE  socials.id IS NOT NULL

在这种情况下,添加外部 COALESCE 是没有意义的,因为如果添加的 WHERE 子句进行过滤,您将得到无行所有输入行。

关于sql - 使用 json_agg 从 SQL 查询获取 [null] 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75647466/

相关文章:

MySQL 组合来自三个查询的数据

mysql - 如何使用内连接查询多个表?

postgresql - Postgres连续累计计数

SQL Insert Select 当select 检索多条记录时

ruby-on-rails - rails 4 范围 NOTNULL 重构

sql - 数组交集作为 group by 的聚合函数

Python 等价于 SQL 中的不等式连接

sql - 我将如何从每列中删除空值

php - 如何在 MYSQL 中使用 GROUP BY 连接来自另一个表的子行并仅显示一次主行?

mysql - SQL使用不同条件多次选择列