2017-07-07 434 views
3

ARRAY_AGG默认值我有一个观点:设置空数组作为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), '[]') 
    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函数来过滤数据。

+0

的东西合并它,就像你用'json_agg做()' –

+0

@NickBarnes json_agg正在返回JSON,我不能使用array_length – Illorian

+0

@NickBarnes还当我尝试用聚结,我得到{}而非[] – Illorian

回答

2

首先,我不会用JSON混合array_agg(注意双引号逃逸;还有我在这里使用select array(.. subquery ..)的手段来得到一个数组,它在一定程度上等同于您的array_agg(..)):

test=# select array(select '{"zz": 1}'::jsonb); 
     array 
----------------- 
{"{\"zz\": 1}"} 

- 在这里你会得到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) 

要获得单jsonb值(用JSON数组内),使用jsonb_agg(..)功能。

被一些默认替代NULL值,像往常一样,你可以使用标准的功能coalesce(..)

test=# select coalesce(null::jsonb, '[]'::jsonb); 
coalesce 
---------- 
[] 
(1 row) 

最后,当我从其他意见看,你需要得到你的jsonb的数组的长度 - 有是为此目的而设计的功能json_array_length(..)jsonb_array_length(..),参见https://www.postgresql.org/docs/current/static/functions-json.html

+0

谢谢。这对我来说真的很有帮助。附:在PostgreSQL 9.5.7文档中,我发现jsonb_agg – Illorian

+0

@Illorian不用客气。没错,'jsonb_agg'存在,我的记忆在这里失败了 - 没有'row_to_jsonb',但有'row_to_json'函数,但这是另一回事。 – Nick

+0

已编辑(jsonb_agg备注) – Nick