在传递的数组中查找具有所有技能的用户

问题描述

我有一个 skillSets 表,其中包含以下字段。

skillSets
-------------------------
userId -> multiple rows for same users

data: JSON {
skillId
}

type

clientId

我想要所有在传递数组中拥有所有技能的用户

所以如果用户skills a,b and not c it should be ignored for skills in (a,b,c)

但它应该选择用户which have skills a,c for skills in (a b,c)

它还应该选择用户 which have skills a,c,d for skills in (a,c)

Select userid,data,type
from g.skillSets where
clientid='cce2032a-fd3d-48a1-8e4c-417eb77776c3'
and type = 'Skill Item'
AND JSONB_EXTRACT_PATH_TEXT(g.skillSets.data,'skillId') in ('72c28245-968f-11eb-b30a-87bc1ba467bd','84737607-968f-11eb-b30a-87bc1ba467bd','cca8631f-968f-11eb-b30a-87bc1ba467bd');

解决方法

使用 jsonb 包含运算符 @>

... WHERE data @> '{ "skillId": [ "a","b","c" ] }'

data 上的 GIN 索引可以支持这种情况。