Postgres选择包含json的json数组中的位置

Posted

技术标签:

【中文标题】Postgres选择包含json的json数组中的位置【英文标题】:Postgres select where in json array containing json 【发布时间】:2017-05-24 15:37:07 【问题描述】:

我在 postgresql 9.4 数据库中有一个带有 jsonb 字段的表。 一些示例行:

["name": "145119603", "numberOfCarrot": 2]
["name": "1884595530", "numberOfCarrot": 1]
["name": "363058213", "numberOfCarrot": 1] 
["name": "1427965764", "numberOfCarrot": 1]
["name": "193623800", "numberOfCarrot": 43, "name": "419955814", "numberOfCarrot": 0]
["name": "624635532", "numberOfCarrot": 0, "name": "1884595530", "numberOfCarrot": 1]
["name": "791712670", "numberOfCarrot": 1]
["name": "895207852", "numberOfCarrot": 0]
["name": "144695994", "numberOfCarrot": 3, "name": "384217055", "numberOfCarrot": 23]
["name": "1079725696", "numberOfCarrot": 10]
如何找到所有行的最大 numberOfCarrot? 如何找到一排的最大数量Carrot? 如何找到 numberOfCarrot 优于或低于某物的行? 如何在 json 数组中找到 numberOfCarrot 优于或低于某物的元素?

【问题讨论】:

【参考方案1】:

您需要一个唯一的列(通常是主键,比如id),因此您的数据应该如下所示:

(1, '["name": "145119603", "numberOfCarrot": 2]'),
(2, '["name": "1884595530", "numberOfCarrot": 1]'),
...

在横向连接中使用jsonb_array_elements()。例子:

select max(value->>'numberOfCarrot')::int
from my_table,
jsonb_array_elements(jdata);

 max 
-----
  43
(1 row) 

select id, max((value->>'numberOfCarrot')::int)
from my_table,
jsonb_array_elements(jdata)
group by 1
order by 1;

 id | max 
----+-----
  1 |   2
  2 |   1
  3 |   1
  4 |   1
  5 |  43
  6 |   1
  7 |   1
  8 |   0
  9 |  23
 10 |  10
(10 rows)

如何使用where

select id, value->>'numberOfCarrot' as "numberOfCarrot"
from my_table,
jsonb_array_elements(jdata)
where (value->>'numberOfCarrot')::int > 20;

 id | numberOfCarrot 
----+----------------
  5 | 43
  9 | 23
(2 rows)

select id, array_agg(value->>'numberOfCarrot') as "numberOfCarrot"
from my_table,
jsonb_array_elements(jdata)
where (value->>'numberOfCarrot')::int > 2
group by 1
order by 1;

 id | numberOfCarrot 
----+----------------
  5 | 43
  9 | 3,23
 10 | 10
(3 rows)    

【讨论】:

以上是关于Postgres选择包含json的json数组中的位置的主要内容,如果未能解决你的问题,请参考以下文章

在postgres 9.5中插入包含json对象的数组作为行

如何在 Postgres 中选择一列 json 对象,以便返回的行是 json 数组?

检查 Postgres JSON 数组是不是包含字符串

AWS Glue 将字符串值从 postgres 转换为 json 数组

在 django 的 postgres db 中将 json 保存为数组

Postgres 9.5 - 查询嵌套 JSON 元素的数组长度