web-dev-qa-db-ja.com

PostgreSQL-列リストの要素数を取得する方法

これは私の注文テーブルがどのように見えるかです:

-----------------------------------------------------------
| 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
------------
11
mongotop

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 ;として使用します。
  • jsonブール値はtrueTRUEではない)のようになります。
  • jsonにはmoneyタイプはありません。_300_の代わりに_$300_を使用してください。
  • jsonlint を使用してjson値を確認​​します。
8
klin

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
2
mongotop