这就是我的订单表的样子:
-----------------------------------------------------------
| 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
------------
答案 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; true
(不是TRUE
); money
类型,请使用300
代替$300
; 答案 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