繁体   English   中英

Postgres如何查找jsonb类型列中包含键和数组的行,其中包含一些带有或条件的值

[英]Postgres how to find rows where in jsonb type column contains key with array which contain some value with or condition

我使用 PostgreSQL 11.8 并面临任务,我需要为产品保存许多尺寸并且也需要按尺寸搜索。 之前有没有嵌套的结构,只有一层,没有乘SIZE

{"SIZE": "98/104", "COLOUR": "Korall", "GENDER": "female", "CURRENCY": "SEK", "AGE_GROUP": "Kids", "ALTERNATIVE_IMAGE": "https://i1.adis.ws/i/Lindex/8016913_8414_PS_MF?w=300&h=300"}

并搜索我确实喜欢

         WHERE ((products_alias.extras @> '{"SIZE":"One Size"}' 
                     OR products_alias.extras @> '{"SIZE":"146/152"}')                       
                     AND (products_alias.extras @> '{"COLOUR":"Flerfärgat"}' 
                     OR products_alias.extras @> '{"COLOUR":"Grå"}'
                     ))

但现在我需要提供机会保存乘以SIZE并为此重构搜索。 如果数据看起来像这样的示例

{"SIZE": ["38", "90", "12", "4"], "COLOUR": "Svart", "GENDER": "female", "CURRENCY": "SEK", "AGE_GROUP": "Adult", "ALTERNATIVE_IMAGE": "https://i1.adis.ws/i/Lindex/7962770_80_PS_MF?w=300&h=300"}

如何使用OR条件构建按SIZE键进行搜索的搜索查询。 就像搜索所有SIZE可以包含值38或值4的地方?

@>运算符也适用于嵌套结构。 要检查数组是否包含 38 或 4,可以使用

products_alias.extras @> '{"SIZE":["4"]}' OR products_alias.extras @> '{"SIZE":["38"]}'

要检查数组是否包含两者,您可以使用

products_alias.extras @> '{"SIZE":["4","38"]}'

您可以将搜索到的值放在文本数组中,然后使用?| 操作员:

where extras -> 'SIZE' ?| array['38', '4']

这将检查运算符左侧的嵌套 JSONB 数组是否包含右侧文本数组中的任何值。

如果您希望 JSONB 数组包含所有目标值,请使用?&而不是?| .

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM