postgres介绍如何在jsonb type列中查找包含key with array的行,其中包含带或条件的值

7jmck4yq  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(264)

我使用postgresql11.8和facetask,在这里我需要为产品保存许多尺寸,并且需要按尺寸搜索。以前有结构没有嵌套,只有一层,没有乘法 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"}

如何为搜索依据生成搜索查询 SIZEOR 条件。喜欢到处搜索 SIZE 可以包含值 38 或价值 4 ?

vojdkbi0

vojdkbi01#

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

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

这将检查操作符左侧的嵌套jsonb数组是否包含右侧文本数组中的任何值。
如果希望jsonb数组包含所有目标值,那么使用 ?& 而不是 ?| .

h9a6wy2h

h9a6wy2h2#

这个 @> 操作符也处理嵌套结构。要检查数组是否包含38或4,可以使用

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

要检查数组是否同时包含这两个元素,可以使用

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

相关问题