我有一个 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”,所以它应该匹配。
这对于规范化结构来说是微不足道的,但是在您找到时间和预算来更改它之前,您可以使用带有
@@
谓词检查运算符的 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”],“类别”:[“电子”]} |