【问题标题】:Postgres and jsonb - search value at any keyPostgres 和 jsonb - 在任意键处搜索值
【发布时间】:2017-05-02 13:48:24
【问题描述】:

是否可以在 Postgres 的 JSONB 列中的任何键处查找给定值? In the documentation我看不到任何例子。

JSONB 列的示例值:

{
  a: 1,
  b: 2,
  c: 3
}

我想在任何地方找到具有1 作为值的所有记录。注意:目前可能有除a, b, c 之外的其他键。

【问题讨论】:

  • 顶级?或任何深处?
  • 你能发布一个你的 jsonb 文本的例子吗?
  • @VaoTsun 顶级
  • @McNets 问题已更新。

标签: postgresql jsonb


【解决方案1】:

use 的值jsonb_each_text,基于先前 McNets 样本的样本,:

t=# select * from json_test join jsonb_each_text(json_test.data) e on true 
where e.value = '1';
 id |                 data                 | key | value
----+--------------------------------------+-----+-------
  1 | {"a": 1}                             | a   | 1
  3 | {"a": 1, "b": {"c": "d", "e": true}} | a   | 1
(2 rows)

【讨论】:

    【解决方案2】:

    使用json_each_text():

    with my_data(id, jdata) as (
    values
        (1, '{ "a": 1, "b": 2, "c": 3}'::json),
        (2, '{ "j": 4, "k": 5, "l": 6}'::json),
        (3, '{ "x": 1, "y": 2, "z": 3}'::json)
    )
    
    select id, jdata
    from my_data,
    lateral json_each_text(jdata) 
    where value::int = 1
    
     id |           jdata           
    ----+---------------------------
      1 | { "a": 1, "b": 2, "c": 3}
      3 | { "x": 1, "y": 2, "z": 3}
    (2 rows)    
    

    【讨论】:

      【解决方案3】:

      也许晚了,但它帮助了我:

      with my_data(id, jdata) as (
      values
          (1, '{ "a": 4, "b": 5}'::jsonb),
          (2, '{ "a": 1, "b": 2}'::jsonb),
          (3, '{ "x": {"y": 3, "z": 1}}'::jsonb),
          (4, '{ "a": [2,1,4]}'::jsonb),
          (5, '{ "a": [{"x": 2}, {"y": 1}, {"z": 2}]}'::jsonb)
      )
      
      select id, jdata
      from my_data
      where jdata @? '$.** ? (@ == 1)';
      
       id |           jdata           
      ----+---------------------------
        2 | { "a": 1, "b": 2 }
        3 | { "x": { "y": 3, "z": 1 } }
        4 | { "a": [2, 1, 4] }
        5 | { "a": [ { "x": 2 }, { "y": 1 }, { "z": 2 } ] }
      (4 rows)    
      

      【讨论】:

      • 您应该补充一点,这需要 Postgres 12,因为该版本中引入了 SQL JSON/Path 运算符
      • 效果很好,但区分大小写。如何更改为不区分大小写?
      • 我找到了:jdata @? '$.** ? (@like_regex 1 flag "i")' - stackoverflow.com/questions/42130740/…
      猜你喜欢
      • 1970-01-01
      • 2023-02-01
      • 1970-01-01
      • 2017-08-31
      • 2021-07-20
      • 2018-01-07
      • 2018-05-19
      • 2023-04-02
      • 2020-05-03
      相关资源
      最近更新 更多