【问题标题】:PostgreSQL - Where In JSONBPostgreSQL - 在 JSONB 中的位置
【发布时间】:2017-10-07 08:36:21
【问题描述】:

我很难查询 jsonb 数据。我不习惯在 postgres 中处理 jsonb 类型。是否可以在 jsonb 字段上执行 WHERE IN

我有这样的数据

id | act   | act_id |      from_ids       |     object_ids       | post_date
2    post      1      {"2":"1494308197"}    {"items":["104564"]}   1494308197

我正在尝试在下面执行类似的操作,以在 from_ids 列中以 id 为键的任何 id 查找。

SELECT an.* FROM activity_network an, jsonb_each(an.from_ids) d WHERE d.key->> in ('2');

但这显然行不通。我尝试了各种形式。

我找到了一个类似的question,但它不能满足我的需要,因为它获得了价值,我需要使用IN 获得key

不确定如何使用这些 jsonb 函数。

【问题讨论】:

    标签: json postgresql jsonb


    【解决方案1】:

    比这简单得多:

    SELECT an.*
    FROM activity_network an
    WHERE an.from_ids ?| ARRAY['2'];
    

    the documentation

    以下索引可以加快这样的查询:

    CREATE INDEX ON activity_network USING gin (from_ids);
    

    【讨论】:

    • 看看那个。这很简单。几个小时一直在敲我的头。感谢您的快速!如果数组中有多个项目,它似乎不使用 gin 索引。你会碰巧知道它是否可以被索引吗?
    • 我已扩展答案以包含该信息。如果您没有看到使用的索引,可能 PostgreSQL 认为顺序扫描更便宜。您可以SET enable_seqscan = off 测试索引是否可以使用。
    【解决方案2】:

    您可以为此使用jsonb_exists 函数。

    SELECT an.* FROM activity_network an WHERE jsonb_exists(an.from_ids,'2');
    

    the PG documentation 中描述的 ? 运算符映射到该函数。如果你使用 PHP、Java 或 C + libpq 以外的任何东西,我建议你改用它,因为世界上每个人都同意 ? 代表位置参数,除了 Postgres 团队。

    【讨论】:

    • 所以我实际上在文档中看不到该功能。你在哪里找到的?
    • 您可以通过在 psql 控制台中运行\doS+ 找到它。它仅在您有 + 时列出相应的功能。有几页了。
    • 但是如何用 jsonb_exists 来表示 WHERE products_alias.extras -> 'SIZE' ?| array['91', '38'] 呢? @Laurenz Albe
    • @shuba.ivan -> 运算符对应于您的情况下的 jsonb_array_element(array,index)jsonb_object_field(object,field)
    • 但是应该怎么看查询WHERE products_alias.extras -> 'SIZE' ?| array['91', '38']
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2015-08-15
    相关资源
    最近更新 更多