PostgreSQL - 如何获取列列表中的元素数

时间:2016-07-21 18:31:03

标签: json postgresql arraylist multiple-columns

这就是我的订单表的样子:

-----------------------------------------------------------
| id  | order
-----------------------------------------------------------
|1    |[{"order_quantity" : 2, "active" : TRUE, "price" : $100 }, {"order_quantity" : 4, "active" : FALSE, "price" : $200 }]
|2    |[{"order_quantity" : 2, "active" : TRUE, "price" : $170 }]
|3    |[{"order_quantity" : 2, "active" : TRUE, "price" : $120 }]
|4    |[{"order_quantity" : 2, "active" : TRUE, "price" : $150 }, {"order_quantity" : 3, "active" : TRUE, "price" : $200 }, {"order_quantity" : 5, "active" : TRUE, "price" : $200 }]
-----------------------------------------------------------

在对每个元素中括号JSON内的WHERE active == TRUE元素进行计数时需要的结果:

------------
id  | counts
------------
|1  |   1
|2  |   1
|3  |   1
|4  |   3
------------

这就是我正在使用但它没有提供我正在寻找的数据,因为它不会查看每个字典以查看active == TRUE

SELECT id, json_array_length(order::JSON)
FROM orders

------------
id  | counts
------------
|1  |   2
|2  |   1
|3  |   1
|4  |   3
------------

2 个答案:

答案 0 :(得分:7)

使用json_array_elements()选择json数组的所有元素,过滤元素并最终计算按id分组的剩余元素。

select id, count(id)
from orders, json_array_elements(orders) elem
where (elem->>'active')::boolean
group by 1
order by 1;

 id | count 
----+-------
  1 |     1
  2 |     1
  3 |     1
  4 |     3
(4 rows)    

注意:

  • json_array_elements()子句中的set return函数(如FROM)用作lateral join;
  • json布尔值应该看起来像true(不是TRUE);
  • json中没有money类型,请使用300代替$300;
  • 使用jsonlint验证json值。

答案 1 :(得分:2)

我首先使用json_array_elements按每个订单规范化订单,然后能够进行计数并检查active = TRUE

WITH normalize_all_orders AS (
    SELECT id
       , json_array_elements(order::JSON) as order_line
    FROM orders
)

SELECT id
       , COUNT(order_line) AS orders_counts

WHERE order_line::json->>'soundFlag' = 'true'
GROUP BY id