【问题标题】:PostgreSQL - return jsonb keys in one columnPostgreSQL - 在一列中返回 json 键
【发布时间】:2017-05-09 08:20:04
【问题描述】:

我有查询在 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 和 3 的 json,省略键 4 - 对吧?..
  • 是的,例如,我有一个要搜索的 id 数组,这种情况是 2 和 3,jsonb 字段还包含 4 的键。但我只想知道查询的 id找到本例中为 2 和 3 的记录。
  • @VaoTsun 我添加了一个示例预期结果。

标签: json postgresql jsonb


【解决方案1】:

我在这里爆炸/内爆它。相当丑陋的方式。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 2022-01-09
      相关资源
      最近更新 更多