我的表 ,t有一個嵌套的 jsonb_object, ss。以下是單個記錄的示例:
{
"id":1,
"ss":[
{ "ss_id":1, "approved":true },
{ "ss_id":2, "approved":false },
]
}
如何計算sswhere中的物件數量approved = true?
我可以獲得ssusing中所有物件的計數jsonb_array_length(),但無法對計數應用過濾器。
SELECT
id,
jsonb_array_length(t.ss) ss_cnt, -- returns total count
jsonb_array_length(
CASE WHEN t.ss -> 'approved' = 'true' THEN t.ss END
) a_cnt, -- returns null
ss
FROM t
對于背景關系,我的最終目標是創建一個布爾指示符,指示中的所有物件是否都ss具有"approved":true. 這是進行評估的中間步驟,但對其他方法持開放態度。
uj5u.com熱心網友回復:
您需要取消嵌套陣列元素 jsonb_array_elements():
select id, value
from t
cross join jsonb_array_elements(ss)
where (value->'approved')::bool
使用布爾聚合函式bool_and檢查陣列的所有元素是否有"approved": true
select id, bool_and((value->'approved')::bool)
from t
cross join jsonb_array_elements(ss)
group by id
Db<>小提琴。
閱讀檔案:
- JSON 函式和運算子
- 聚合函式
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/412313.html
標籤:
