带有哈希元素数组的 PostgreSQL jsonb_array_elements

标签 postgresql postgresql-9.4 jsonb

我有一个 PostgreSQL 表(creatures),如下所示:

| id <integer> | json <jsonb> |
-------------------------------
|      1       | {"name": "Grooper", "weaknesses":[{"type":"Fire", "value":2},{"type":"Dark", "value":2}]} |
|      2       | {"name": "Zik", "weaknesses":[{"type":"Fire", "value":2}]} |

我正在尝试创建一个过滤弱点类型的查询,这样我就可以过滤所有弱点类型为Fire Dark(包含任何一个),但也查询具有Fire Dark类型弱点的生物(必须包含两者)。

我想出了一个适用于 Fire Dark 的查询:

select 
  distinct c.* 
from 
  creatures c, 
  jsonb_array_elements(json->'weaknesses') as weakness 
where weakness->'type' ?| array['Fire','Dark']

我怎样才能让这个查询过滤Fire Dark类型的生物?

更新:

我有一个查询似乎可以完成我想要的,但它看起来并不漂亮。有什么建议吗?

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 文件不必检查以删除重复项。

关于带有哈希元素数组的 PostgreSQL jsonb_array_elements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36732784/

相关文章:

arrays - 错误 : operator does not exist: jsonb[] -> integer

sql - 获取包含 JSONB 值的行,如果值不存在,也获取行

sql - 仅返回列中的数值 - Postgresql

sql - 用户定义的 SQL 函数计算错误

database - docker 和 PostgreSQL : can not create database having '-' in database name during initialization

postgresql - Postgres查询结果转json对象

java - PostgresQL 和 Hibernate 自动生成(不是 PK)值

sql - 如何对有序行进行分组?

postgresql - 将 postgresql 列从字符变化转换为整数

sql - Postgres 查询运行很慢