【问题标题】:Query a column with jsonb data meeting certain criteria查询符合特定条件的jsonb数据列
【发布时间】:2021-05-03 19:42:34
【问题描述】:

问题

我有一张这样的桌子:

product tags (jsonb)
P001 [{"name": "LX","active": true}, {"name": "TX","active": true}]
P002 [{"name": "LX","active": true}]

我正在尝试查询此表以获取标签相同的产品列表。

我发现以下内容不足以满足我的查询,因为它将匹配至少带有我查询的标签的所有产品:

SELECT product
FROM product_table 
WHERE tags @> '[
    {"name": "LX","active": true}
]';

结果

product
P001
P002

所以我需要更精确的匹配,而不是严格到要求数组中标记对象的顺序。例如:

[
    {
        "name": "LX",
        "active": true
    },
    {
        "name": "TX",
        "active": true
    }
]
-- Interpreted the same as
[
    {
        "name": "TX",
        "active": true
    },
    {
        "name": "LX",
        "active": true
    }
]

期望的结果

仅与查询中的标签匹配的产品列表。

资源

我用来尝试解决问题的资源列表。

【问题讨论】:

  • 发现:当我将运算符 时,反之亦然,我得到不同的行为,这可能对我有利。我认为答案涉及到这一点。

标签: sql postgresql jsonb


【解决方案1】:

根据您给出的示例,您可以在两个方向上同时使用。

...WHERE tags <@ :whatever and tags @> :whatever

如果您不喜欢重复参数,您可以创建自定义函数或运算符:

create function equal_but_for_order(jsonb,jsonb) returns boolean language sql as $$ 
    select $1 <@ $2 and $1 @> $2
$$;

create operator <@> (function = equal_but_for_order, leftarg = jsonb, rightarg=jsonb);

...WHERE tags <@> :whatever

【讨论】:

  • 感谢您的回答,您看到我上面的最新评论了吗?您如何根据 postgres 文档更改方向?
  • 做到了! @jjanes 我很接近,因为我正在研究如何使用 AND 交替使用 @&gt;&lt;@ 运算符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多