【问题标题】:Access jsonb value[] by key按键访问jsonb value[]
【发布时间】:2020-08-29 18:05:24
【问题描述】:

我目前将数据存储在 postgres db 的 jsonb 列中,格式如下: {"ids": [4, 3, 2, 1]} 其中值是一个整数数组。

我希望做以下事情:

  1. 找到该列在值中包含值 4 的行
    'ids' 键的数组。

  2. 在“ids”键的值数组中找到列包含值 2,3 和 1 的行。

我最近的尝试使用以下

select * from tablename WHERE (column_name -> ids)::integer[] && ARRAY[1,3]

这给了我一个类型转换错误 ::integer[] ERROR: cannot cast type jsonb to integer[]

我怀疑我试图投射“ids”部分并且需要更深入,但我不确定如何(如果这甚至是正确的方法)。

【问题讨论】:

    标签: postgresql jsonb


    【解决方案1】:

    使用包含运算符@>

    select * 
    from tablename 
    WHERE column_name @> '{"ids":[4]}'
    

    这也适用于多个值:

    select * 
    from tablename 
    WHERE column_name @> '{"ids":[1,2,3]}'
    

    Online example

    【讨论】:

    • @ИгорьТыра:是的,它会返回这些,请参阅在线示例
    【解决方案2】:
    SELECT * from tablename WHERE column_name -> 'ids' @> '[4]'::jsonb
    SELECT * from tablename WHERE column_name -> 'ids' @> '[2,3,1]'::jsonb
    

    【讨论】:

    • 我在 Postico 中的“->”处收到语法错误,并且这些查询在 psql 中没有返回。 @a_horse_with_no_name 的解决方案对我有用。为什么我会在 -> 处收到语法错误,因为我知道它是一个有效的运算符?
    • 不了解 Postico,但 psql 运算符 @> 可能取决于版本,我使用 @a_horse_with_no_name 的小提琴尝试了我的代码,它适用于 v12 和 v11
    • 可能就是这样。我使用的是 9.6。
    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2021-05-13
    • 2020-05-18
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2019-07-21
    相关资源
    最近更新 更多