PostgreSQL 查询包含特定键值的 json 对象中的行

Posted

技术标签:

【中文标题】PostgreSQL 查询包含特定键值的 json 对象中的行【英文标题】:PostgreSQL query rows in json object that contains certain key value 【发布时间】:2020-04-14 11:19:42 【问题描述】:

我有一个名为tx 的示例表,它存储有关事务的信息,并且我使用的是 PostgreSQL 10.6。

# info about my PostgreSQL version
select version()
> PostgreSQL 10.6 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11), 64-bit

看起来像这样:

# create table
create table tx (id bigserial primary key, msg jsonb not null);

# create index on 'type' value of msg column
create index on tx using gin ((msg->'type'));

tx 表中插入行

insert into tx (msg) values
('["type": "MsgSend", "value": "amount": ["denom": "dollar", "amount": "100"], "from": "Jeniffer", "to": "James" ]'),
('["type": "MsgSend", "value": "amount": ["denom": "dollar", "amount": "30"], "from": "Jeniffer", "to": "James" ]'),
('["type": "MsgBuy", "value": "amount": ["denom": "dollar", "amount": "10"], "from": "George", "to": "Smith" ]'),
('["type": "MsgSend", "value": "amount": ["denom": "dollar", "amount": "60"], "from": "Jeniffer", "to": "James" ]');

我已阅读此Querying JSON (JSONB) data types in PostgreSQL 并搜索了类似的帖子并使用任何给定的示例进行了测试,但它们似乎并不能很好地指导我解决我想要完成的任务,即查询json object 中的行,不是json array

这些帖子

Check if a Postgres JSON array contains a string

querying json object from table in postgreSQL

PostgreSQL JSON Query with embedded json Object

如何实现这些查询?我相信如果我知道如何查询一个问题,那么我将能够解决其他问题。

    如何查询msg列包含type的键值为MsgSend的数据?

    如何查询msg列包含from的键值为Jeniffer的数据?

    如何查询msg列包含MsgSend且数量为greater than 50的数据?

我将提供任何可能需要的信息来解决这个问题。

【问题讨论】:

9.3 不再受支持,从那时起对 JSON 的支持有所提高。使用更新的版本。 为什么将 JSON 对象包装在长度为 1 的无偿数组中?你能解决这个问题,还是不能协商? @jjanes 感谢您的 cmets。这是不可协商的。看起来 Tomer Sela 在下面回复了,这是我需要知道的。 【参考方案1】:

官方Postgresql documentation包含你需要的一切。

根据您的问题查看以下查询:

    如何查询msg列包含的数据,键值为MsgSend的类型?
select * from tx where msg->0->>'type' = 'MsgSend';
    如何查询msg列包含from的键值是Jeniffer的数据?
select * from tx where msg->0->'value'->>'from' = 'Jeniffer';
    如何查询msg列包含MsgSend且数量大于50的数据?
select * from tx where (msg->0->'value'->'amount'->0->>'amount')::int > 50;

【讨论】:

以上是关于PostgreSQL 查询包含特定键值的 json 对象中的行的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL9.4往jsonb字段新增键值SQL怎么写

如何在Django中查询具有特定数量的外键关系并且在这些外键值中具有特定值的对象?

在执行 Select 查询时,如何忽略 Postgresql 中某列具有特定值的数据行?

Postgresql:如何查询包含某些值的 JSONb 数组

如何比较每个字典中 JSON Array 键值的字符串以查看它们是不是包含 NSUserDefault 字符串并返回 JSON 字典匹配项

检查对象数组中是不是存在具有特定键值的对象