【问题标题】:How to query the values in a jsonb column in PostgreSQL?如何在 PostgreSQL 中查询 jsonb 列中的值?
【发布时间】:2020-04-19 15:02:24
【问题描述】:

给定一个名为 pairsjsonb 列,在单个记录中包含如下数据:

{ "foo": 1, "bar": 2 }

如何查询给定值是上述字段中的之一的记录。

例如,查询 1 将匹配上述记录。
3 的查询不匹配。

PostgreSQL 9.5

【问题讨论】:

    标签: json postgresql jsonb postgresql-9.5


    【解决方案1】:

    在 Postgres 9.5 中,在横向连接中使用函数 jsonb_each_text()

    with my_table(pairs) as (
    values 
        ('{ "foo": 1, "bar": 2 }'::jsonb)
    )
    
    select t.*
    from my_table t
    cross join jsonb_each_text(pairs)
    where value = '1';
    

    升级到 Postgres 12 并使用 json 路径函数,例如:

    select *
    from my_table
    where jsonb_path_exists(pairs, '$.* ? (@ == 1)')
    

    阅读更多:JSON Functions and Operators.

    【讨论】:

    • 在没有withcross join 子句的情况下是否可以在PostgreSQL 9.5 中执行此操作?仅使用selectleft joininner join
    • with 语句不是必需的,在这个例子中它就像你的原始表一样。 cross join 在这里并不表示笛卡尔积,因为它是横向连接。但是,如果您愿意,可以将其替换为 left join。见Db<>fiddle.
    • 谢谢。是否可以在没有 JOIN 的 Postgres 9.5 中做到这一点?也就是说,只有一个 WHERE 子句?
    • 实际上不是。如果您有主键(或唯一列),您可以尝试在WHERE 子句中使用jsonb_each_text(),但横向连接更简单、更快。重点是9.5中没有jsonb_path_exists()这样的函数,所以要使用集合返回函数jsonb_each_text()
    • 感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 2021-01-13
    • 1970-01-01
    • 2020-10-19
    • 2016-08-01
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多