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

e7arh2l6  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(198)

我的订单表看起来是这样的:

-----------------------------------------------------------
| 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 }]
-----------------------------------------------------------

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

------------
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
------------
w3nuxt5m

w3nuxt5m1#

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

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

Db<>fiddle.中的现场演示
注意事项:

  • 使用FROM子句中的set返回函数(如json_array_elements())作为横向连接;
  • json boolean值应该像true(而不是TRUE);
  • json中没有money类型,使用300代替$300;
  • 使用jsonlint验证json值。
c9qzyr3d

c9qzyr3d2#

我首先使用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

相关问题