在 postgres 中计算有条件的 jsonb 数组

count jsonb array with condition in postgres

我有一个 postgres 数据库,其中一些列数据存储如下:

guest_composition charging_age
[{"a": 1, "b": 1, "c": 1, "children_ages": [10, 5, 2, 0.1]}] 3
[{"a": 1, "b": 1, "c": 1, "children_ages": [2.5, 1, 4]}] 3

我想遍历 children_ages 数组并 return 3 岁以上的 children 的计数。我很难使用数组数据,因为它是 returns 作为 jsonb 而不是 int 数组。

第一行应该return2因为3岁以上有2children第二行应该return1因为有1child 3岁以上

我尝试了以下方法但没有用:

WITH reservation AS (SELECT jsonb_array_elements(reservations.guest_composition)->'children_ages' as children_ages, charging_age FROM reservations

SELECT (CASE WHEN (reservations.charging_age IS NOT NULL AND reservation.children_ages IS NOT NULL) THEN SUM( CASE WHEN (reservation.children_ages)::int[] >=(reservations.charging_age)::int THEN 1 ELSE 0 END) ELSE 0 END) as children_to_charge

您可以使用 SQL JSON 路径函数提取所有儿童年龄的数组:

select jsonb_path_query_array(r.guest_composition, '$[*].children_ages[*] ? (@ > 3)')
from reservations r;

该数组的长度就是您要查找的计数:

select jsonb_array_length(jsonb_path_query_array(r.guest_composition, '$[*].children_ages[*] ? (@ > 3)'))
from reservations r;

我不清楚 charging_age 是否是一列并且每一行都可以更改。如果是这种情况,您可以将参数传递给 JSON 路径函数:

select jsonb_path_query_array(
          r.guest_composition, '$[*].children_ages[*] ? (@ > $age)', 
          jsonb_build_object('age', charging_age)
       )
from reservations r;