Postgres JSONB 对象过滤

问题描述 投票:0回答:1

我有一个 Postgres 表,如下所示:

CREATE TABLE products(
   id string,
   attributes jsonb,
   PRIMARY KEY(id)
);

属性字段的示例如下:

 {
      "endDate": [
        "2024-02-20T21:00:00.000Z"
      ],
      "countries": [
        "US","IT","ES"
      ],
      "type": [
        "RETAIL"
      ],
      "startDate": [
        "2024-02-13T08:00:00.000Z"
      ],
      "categories": [
        "ELECTRONICS"
      ],
      "currency": [
        "USD"
      ],
      "status": [
        "ACTIVE"
      ]
    }

我需要创建过滤器,作为输入我可能会获得国家/地区列表,例如[“US”、“MX”] 具有这些国家/地区之一的每个产品都将符合条件和/或起始日期可能晚于某个提供的日期。 我也对此类查询的性能感兴趣,因为该表可能非常大。

我尝试使用此查询按国家/地区过滤产品:

SELECT *
FROM products
WHERE
  (attributes @> '{ "countries": ["US","MX","JP"] }')

但是此查询将仅列出具有所有 3 个提供的国家/地区的产品。我需要至少有一个国家/地区匹配,在本例中,它有“US”,所以它应该匹配。

sql postgresql jsonb
1个回答
0
投票

这对于规范化结构来说是微不足道的,但是在您找到时间和预算来更改它之前,您可以使用带有

@@
谓词检查运算符的 jsonb JSONPath 表达式:

select * from products
where attributes 
@@ '  exists($.countries[*] 
             ?(  @=="US"
               ||@=="MX" ))
    && exists($.startDate?
              (@>"2024-02-12T07:00:00.000Z"))'
;
id 属性
1 {“类型”:[“零售”],“状态”:[“活跃”],“结束日期”:[“2024-02-20T21:00:00.000Z”],“货币”:[“美元”] ,“国家”:[“美国”,“意大利”,“西班牙”],“开始日期”:[“2024-02-13T08:00:00.000Z”],“类别”:[“电子”]}

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.