これは私の注文テーブルがどのように見えるかです:
-----------------------------------------------------------
| 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
------------
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)
_
ノート:
FROM
句のsetreturning関数(json_array_elements()
など)を lateral join ;として使用します。true
(TRUE
ではない)のようになります。money
タイプはありません。_300
_の代わりに_$300
_を使用してください。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