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

问题描述

我使用 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"}

如何为带有条件的SIZE键搜索构建搜索查询。OR喜欢搜索所有SIZE可以包含 value38或 value的地方4

标签: sqljsonpostgresqlwhere-clausejsonb

解决方案


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

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

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

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

推荐阅读