仍在学习SQL/PostgreSQL.我正在努力想办法停止返回空值为[null]的数组,而只返回一个空array.

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

我错过了什么或做错了什么?据我了解,当返回值是null/false时,基本上是用COALESCE来替换.我这样想是不是错了?另外,我的SQL查询可能有什么问题?

推荐答案

外部COALESCE不会执行您想要的操作,因为json_agg()永远不会返回null,除非没有符合条件的输入行.对于null个输入,COALESCE只起作用--而不是您所说的102/106!(包含单个null值作为数组元素的数组与null不同!)

改用Aggregate 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

Now,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子句过滤所有输入行,则会得到no row.

Sql相关问答推荐

Postgresql在加入时显示重复的行

如何从上一个值减go 值

BigQuery`喜欢ANY‘和`不喜欢ANY’

有没有办法在每次计算每一行的数据时更新2个值?

Select 起始参数和截止参数之间的间隔,包括与期间重叠的参数

BigQuery-当子查询不返回任何结果时,所有结果为零

SQL:如何将相应位置的两个数组中的元素组合在一起

无法将发票与产品价格相关联

如何用HeidiSQL在Firebird中设置超时?

插入具有预期逻辑的查询以Forking 表

如何判断小数点后千位是否不为0

SQL根据另一列的顺序和值获取组中的最后一列

具有多个表 JOINS 的 STRING_AGG 的替代方法 (SQL Server 2016)

SQL SUM Filter逻辑解释

如何在TSQL中编写此窗口查询

BigQuery导航函数计算ID

获取记录的上一个值,并将其与当前值一起显示

检索具有相同位置的最小和最大store 数量

如何仅在满足条件时才按顺序在 SQL 中计数?

Oracle SQL 从多个条件中 Select 但具有相同的 id