PostgreSQL - 在一列中返回jsonb键

时间:2017-05-09 08:20:05

标签: json postgresql jsonb

我有查询在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}

2 个答案:

答案 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函数。