我有查询在jsonb列中搜索id,该数组可以包含许多id。
说我有这样的数据
id | act | act_id | from_ids | object_ids | post_date
2 post 1 {"2":"1494308197","3":"1494308198","4":"1494308199"} {"items":["104564"]} 1494308197
像这样的查询
SELECT an.*
FROM activity_network an
WHERE an.from_ids ?| ARRAY['2','3'];
该查询将返回该行,因为它找到2和3.但是如何返回它在自己的列中找到的内容。因此它在文本或json格式中返回2,3或在结果中返回类似的东西。
我试过这个
SELECT an.*, jsonb_each_text(from_ids) b
FROM activity_network an
WHERE an.from_ids ?| ARRAY['2','3'];
但是这会创建3行,每行有一个b列,值为2,3和4.我想要1行,其中b列包含2和3,这是我搜索的内容。
这可能吗?
我正在寻找的示例结果。注意最后一栏。我把它作为用于演示目的的分隔列。它可以是我可以使用的任何格式。
2 | post | 1 | {"2":"1494308197","3":"1494308198","4":"1494308199} | {"items":["104564"]} | 1494308197 | 2,3}
答案 0 :(得分:2)
在这里我爆炸/内爆它。相当难看的方式。
t=# with p as (
with c as (
select '{"2":"1494308197","3":"1494308198","4":"1494308199"}'::json j
)
select json_object_keys(j),j->json_object_keys(j) v
from c
)
select concat('{',string_agg(concat('"',json_object_keys,'"',':',v)::text,','),'}')::json
from p
where json_object_keys::int = ANY (ARRAY [2,4]);
concat
-------------------------------------
{"2":"1494308197","4":"1494308199"}
(1 row)
Time: 0.348 ms
答案 1 :(得分:0)
函数jsonb_exists_all
听起来像你想要的。它要求数组中的所有元素都作为对象中的顶级键存在。
您可以使用psql中的\df *jsonb*
命令为jsonb找到该函数和其他未记录的函数。
示例粘贴:
test=# SELECT * from twj WHERE jsonb_exists_any(from_ids, ARRAY['2','3']);
id | act | from_ids
----+------+-----------------------------------------------------------
1 | post | {"2": "1494308197"}
3 | post | {"2": "1494308197", "3": "1494308198", "4": "1494308199"}
(2 rows)
test=# SELECT * from twj WHERE jsonb_exists_all(from_ids, ARRAY['2','3']);
id | act | from_ids
----+------+-----------------------------------------------------------
3 | post | {"2": "1494308197", "3": "1494308198", "4": "1494308199"}
(1 row)
您使用的?|
运算符调用jsonb_exists_any
函数。