gpt4 book ai didi

arrays - PostgreSQL 中 json 数组值的交集

转载 作者:行者123 更新时间:2023-11-29 11:59:34 24 4
gpt4 key购买 nike

在 PostgreSQL 9.4 中,我有一个这样的表:

id | array_json
---+----------------------------
1 | [{"type": "single", "field_id": 9},
| {"type": "range", "field_id": 2}, ...]
|
2 | [{"type": "single", "field_id": 10},
| {"type": "range", "field_id": 2}, ...]
...

我想获取 array_json 列中所有 field_id 值的交集跨所有表

| field_id intersection
+-------
| 2

我的意思是:

1. 为第一行映射 field_id 值:[9, 2]

2. 为第二行映射 field_id 值:[10, 2]

n.n 映射 field_id 值 ...

...

last. 获取所有行的交集:[2](假设该表只有两行)

谁能告诉我这是怎么做到的?

提前致谢

最佳答案

您将需要一个聚合来与连续行的数组相交:

create or replace function array_intersect(anyarray, anyarray)
returns anyarray language sql
as $$
select
case
when $1 is null then $2
when $2 is null then $1
else
array(
select unnest($1)
intersect
select unnest($2))
end;
$$;

create aggregate array_intersect_agg (anyarray)
(
sfunc = array_intersect,
stype = anyarray
);

使用 jsonb_array_elements()array_agg() 以整数数组的形式检索 field_ids:

select id, array_agg(field_id) field_ids
from (
select id, (e->>'field_id')::int field_id
from a_table, jsonb_array_elements(array_json) e
) sub
group by 1
order by 1;

id | field_ids
----+-----------
1 | {9,2}
2 | {10,2}
(2 rows)

使用定义的交集集合对所有行的数组进行交集:

select array_intersect_agg(field_ids)
from (
select id, array_agg(field_id) field_ids
from (
select id, (e->>'field_id')::int field_id
from a_table, jsonb_array_elements(array_json) e
) sub
group by 1
order by 1
) sub;

array_intersect_agg
---------------------
{2}
(1 row)

关于arrays - PostgreSQL 中 json 数组值的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34731706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com