2017-05-24 35 views
0

我在postgresql 9.4数据库中有一个jsonb字段的表。 一些示例行:Postgres选择json数组中包含json的地方

[{"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?
  • 如何找到一行的最大numberOfCrotrot?
  • 如何找到numberOfCrotrot优于或劣于某些行的行?
  • 如何找到json数组中的numberOfCrotrot优于或劣于某个元素的元素?

回答

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)  
+0

感谢!这是完美的 !!! – user3805731