将空数组设置为postgresql中数组_agg的默认值

将空数组设置为postgresql中数组_agg的默认值,postgresql,Postgresql,我有一个看法: CREATE OR REPLACE VIEW microservice_view AS SELECT m.id :: BIGINT, m.name, m.sending_message_rate :: BIGINT, m.max_message_size :: BIGINT, m.prefetch_count :: BIGINT, (SELECT COALESCE(json_agg(DISTINCT node_id), '[]'

我有一个看法:

CREATE OR REPLACE VIEW microservice_view AS
  SELECT
    m.id :: BIGINT,
    m.name,
    m.sending_message_rate :: BIGINT,
    m.max_message_size :: BIGINT,
    m.prefetch_count :: BIGINT,
    (SELECT COALESCE(json_agg(DISTINCT node_id), '[]')
     FROM public.microservice_node
     WHERE microservice_id = m.id) AS nodes,

    (SELECT array_agg(DISTINCT json_build_object('id', transport_id :: INT,
                                                 'is_available', (credentials ->> 'is_available') :: BOOLEAN,
                                                 'username', credentials ->> 'username',
                                                 'password', credentials ->> 'password',
                                                 'default', (default_transport) :: BOOLEAN) :: JSONB
    )
     FROM transport_microservice
     WHERE microservice_id = m.id) AS transports
  FROM public.microservice m
  GROUP BY m.id
  ORDER BY m.id ASC;

有时传输是空的。如何将空数组设置为array_agg的默认值?此字段应为空数组或包含数据的数组。在某些情况下,我使用array_length函数来过滤数据。

首先,我不会将array_agg与JSON混合使用,注意双引号转义;我还使用select数组。。子查询。。这里的诀窍是获得一个数组,它在某种程度上相当于您的数组。\u agg.:

-在这里,您将获得JSONB数组,而您真正需要的是单个JSONB值,其中包含一个嵌入式数组:

test=# select pg_typeof(array(select '{"zz": 1}'::jsonb));
 pg_typeof
-----------
 jsonb[]
(1 row)


test=# select pg_typeof('[{"zz": 1}]'::jsonb);
 pg_typeof
-----------
 jsonb
(1 row)
要获取包含JSON数组的单个jsonb值,请使用jsonb_agg。。功能

要在默认情况下替换空值,通常可以使用标准函数coalesce.:


最后,正如我从其他注释中看到的,您需要获取jsonb的数组长度-有函数json_array_length。。和jsonb_数组_长度。。为此目的而设计的,请参见。

将其与某些内容合并,就像您对json所做的那样_agg@NickBarnesjson_agg正在返回json,我无法使用数组_length@NickBarnes另外,当我尝试使用coalesce时,我得到的是{},而不是[]array_removequery,NULL也不会working@Illoran,但{}实际上是一个空数组。尝试选择数组[]::文本[];谢谢这对我真的很有帮助。另外,我在PostgreSQL 9.5.7文档中找到了jsonb_agg@Illorian不客气。对,jsonb_agg存在,我的内存在这里有点失败-没有row_to_jsonb,但是有row_to_json函数,但这是另一个故事。
test=# select pg_typeof(array(select '{"zz": 1}'::jsonb));
 pg_typeof
-----------
 jsonb[]
(1 row)


test=# select pg_typeof('[{"zz": 1}]'::jsonb);
 pg_typeof
-----------
 jsonb
(1 row)
test=# select coalesce(null::jsonb, '[]'::jsonb);
 coalesce
----------
 []
(1 row)