PostgreSQL jsonb_数组_元素和哈希元素数组

PostgreSQL jsonb_数组_元素和哈希元素数组,postgresql,postgresql-9.4,jsonb,Postgresql,Postgresql 9.4,Jsonb,我有一个如下所示的PostgreSQL表(生物): | id <integer> | json <jsonb> | ------------------------------- | 1 | {"name": "Grooper", "weaknesses":[{"type":"Fire", "value":2},{"type":"Dark", "value":2}]} | | 2 | {"name": "Zik", "weakn

我有一个如下所示的PostgreSQL表(生物):

| id <integer> | json <jsonb> |
-------------------------------
|      1       | {"name": "Grooper", "weaknesses":[{"type":"Fire", "value":2},{"type":"Dark", "value":2}]} |
|      2       | {"name": "Zik", "weaknesses":[{"type":"Fire", "value":2}]} |
我如何才能让这个查询工作来过滤类型为
的生物

更新:

我有一个查询,它似乎实现了我想要的,但它看起来并不漂亮。有什么建议吗

SELECT * FROM creatures
WHERE 'Fire' in (SELECT jsonb_array_elements(json->'weaknesses')->>'type') 
AND 'Dark' in (SELECT jsonb_array_elements(json->'weaknesses')->>'type')

这里的问题是,您必须“查看”数组中的
jsonb
值,因此不能使用
?&
运算符。相反,使用
操作符查找相应的键,并仅选择具有两次点击的行:

SELECT DISTINCT id, json
FROM creatures
JOIN LATERAL jsonb_array_elements(json->'weaknesses') ON value ? 'Dark' OR value ? 'Fire'
GROUP BY 1, 2
HAVING count(id) = 2;
顺便说一句,如果
id
是唯一的(可能是主键?),那么
SELECT DISTINCT ON(id)id,json…
要快得多,因为
jsonb
文档不必检查以删除重复项

SELECT DISTINCT id, json
FROM creatures
JOIN LATERAL jsonb_array_elements(json->'weaknesses') ON value ? 'Dark' OR value ? 'Fire'
GROUP BY 1, 2
HAVING count(id) = 2;