将空数组设置为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)