Postgres:如何获取 json 多个布尔列的数组?
Postgres: How to get json array of multiple boolean columns?
PG_VERSION: 9.2
我有一个带有多个布尔标志的 table。
例如:
id,flag1,flag2,flag3
问题是,我想获得这些标志的 json 数组,其计数如下:
[{"title":"flag1","count":2},{"title":"flag2","count":3},{"title":"flag3","count":0}]
如何实现这个结果?试过这个
create or REPLACE function count_test(OUT json_string text) returns text
LANGUAGE plpgsql AS $$
BEGIN SELECT array_to_json(array_agg(rows))into json_string FROM ( select sum(case when flag1 then 1 else 0 end) as flag1,
sum(case when flag2 then 1 else 0 end) as flag2,
sum(case when flag3 then 1 else 0 end) as flag3 FROM flags
) rows;
END;
$$;
但是有了这个我只能得到
[{"flag1":2,"flag2":2,"flag3":0}]
等待立即回复。
您可以将 row_to_json
结果聚合到数组,然后尝试将其转换为 json 等等,但考虑到 9.2 中非常有限的 json 支持,我只是构建 json 来自字符串,例如:
postgres=# with flags(id,flag1,flag2) as (values(1,true,true),(2,false,true))
, s as (select sum(flag1::int) as f1, sum(flag1::int) as f2 from flags)
select concat('[{"title":"flag1","count":',f1,'},{"title":"flag2","count":',f2,'}]')::json from s;
concat
-----------------------------------------------------------
[{"title":"flag1","count":1},{"title":"flag2","count":1}]
(1 row)
PG_VERSION: 9.2
我有一个带有多个布尔标志的 table。
例如:
id,flag1,flag2,flag3
问题是,我想获得这些标志的 json 数组,其计数如下:
[{"title":"flag1","count":2},{"title":"flag2","count":3},{"title":"flag3","count":0}]
如何实现这个结果?试过这个
create or REPLACE function count_test(OUT json_string text) returns text
LANGUAGE plpgsql AS $$
BEGIN SELECT array_to_json(array_agg(rows))into json_string FROM ( select sum(case when flag1 then 1 else 0 end) as flag1,
sum(case when flag2 then 1 else 0 end) as flag2,
sum(case when flag3 then 1 else 0 end) as flag3 FROM flags
) rows;
END;
$$;
但是有了这个我只能得到
[{"flag1":2,"flag2":2,"flag3":0}]
等待立即回复。
您可以将 row_to_json
结果聚合到数组,然后尝试将其转换为 json 等等,但考虑到 9.2 中非常有限的 json 支持,我只是构建 json 来自字符串,例如:
postgres=# with flags(id,flag1,flag2) as (values(1,true,true),(2,false,true))
, s as (select sum(flag1::int) as f1, sum(flag1::int) as f2 from flags)
select concat('[{"title":"flag1","count":',f1,'},{"title":"flag2","count":',f2,'}]')::json from s;
concat
-----------------------------------------------------------
[{"title":"flag1","count":1},{"title":"flag2","count":1}]
(1 row)