使用PostgreSQL 14,我有一个表'fruits',其中一个名为'items'的JSONB列包含以下示例数据:

[{"anz": 4, "typ": "Banana"}, {"anz": 5, "typ": "Apple"}, {"anz": 2, "typ": "Grapefruit"}]
[{"anz": 1, "typ": "Banana"}, {"anz": 1, "typ": "Apple"}, {"anz": 3, "typ": "Grapefruit"}]

这是可行的:

SELECT * FROM fruits WHERE items @> '[{"typ":"Apple"}]';
SELECT * FROM fruits WHERE (items -> 0 ->> 'lvl')::int > 4;

但现在我只想获取苹果有'澳新银行3'的记录.当然,将上述查询中的WHERE子句组合在一起并不合适.什么是合适的SQL?

预期输出应为标识的记录(SELECT*FROM..其中..)

推荐答案

一种 Select 是使用json_array_elements()将数组提取到元素中,然后应用您的条件:

SELECT i.value as item
FROM fruits f
CROSS JOIN jsonb_array_elements(items) i
WHERE f.items @> '[{"typ":"Apple"}]'
      AND (i->>'anz')::int > 3
      AND i->>'typ' = 'Apple';

结果:

item
{"anz": 5, "typ": "Apple"}

Demo here

Postgresql相关问答推荐

如何在Windows中安装sql for golang

DBT-DBT依赖于未找到的源

Postgres内部如何计算月份间隔

JPA findBy 字段忽略大小写

如何在 Sequelize ORM 中插入 PostGIS GEOMETRY 点?

PostgreSQL比较两个jsonb对象

PostgreSQL:please specify covering index name是什么意思

如何在 PostgreSQL 中截断日期?

PostgreSQL 中的 JSON 外键

从 psycopg2 异常中获取错误消息

Rails 4查询由单个属性唯一

在 PostgreSQL 中表示Sparse稀疏数据

没有查询要创建的in ... error

Postgres NOT IN (null) 没有结果

用于更改 postgresql 用户密码的 bash 脚本

为 postgresql 存储过程设置隔离级别

Oracle 相当于 Postgres 的 DISTINCT ON?

学习 PL/pgSQL 的好资源?

使用 Spring、Hibernate 和 C3P0 管理多租户 Web 应用程序中的连接池

GRANT SELECT 特权使用一个语句对所有序列