我正在嘗試構建一個 JSON 物件,我想查詢出特定的結果,具體來說,我將使用 Postgres 讀取 JSON 資料。
示例 JSON:
{
"ports": [
{"p1":{"interactions_type":{"num_rds":4,"num_wrts":8},"interactions_dynamics":{"rds_min":1,"rds_max":10}}},
{"p2":{"interactions_type":{"num_rds":7,"num_wrts":2},"interactions_dynamics":{"rds_min":6,"rds_max":8}}},
{"p3":{"interactions_type":{"num_rds":14,"num_wrts":6},"interactions_dynamics":{"rds_min":5,"rds_max":50}}}
]
}
我想運行的一些查詢:
- 選擇所有埠名稱(p1、p2、p3)
- 選擇埠數 (3)
- 選擇
interactions_dynamics埠 p2 的所有輸入("rds_min":6,"rds_max":8) - 選擇帶有
interactions_type->num_rds>= 7 (p2,p3)的埠 - 選擇埠名稱,
interactions_type->num_wrts,interactions_dynamics->rds_minwhereineraction_dynamics->rds_max> 20 ("p3,6,5")
您明白了,類似于 SQL 的靈活性。我擁有的 JSON 結構可能無法支持我需要做的事情,或者我不知道如何撰寫查詢。
任何人都可以提出更好的方法來構建它嗎?
uj5u.com熱心網友回復:
根據您在資料庫中使用的版本,您可以使用Postgres 檔案 json從 JSON 中提取資料。
演示
-- select all the port names (p1,p2,p3)
---------------------------------------
select
jsonb_object_keys(jp) as "port names"
from
test t
cross join jsonb_array_elements(t.data -> 'ports') jp;
-- select the number of ports (3)
---------------------------------
select
jsonb_array_length(t.data -> 'ports') as "number of ports"
from
test t;
-- select all the interactions_dynamics infor for port p2 ("rds_min":6,"rds_max":8)
-----------------------------------------------------------------------------------
select
jp -> 'p2' -> 'interactions_dynamics'
from
test t
cross join jsonb_array_elements(t.data -> 'ports') jp
where
jp ? 'p2';
-- select the ports with interactions_type -> num_rds >= 7 (p2,p3)
------------------------------------------------------------------
select
jpv.key
from
test t
cross join jsonb_array_elements(t.data -> 'ports') jp
cross join jsonb_each(jp) jpv
where
(jpv.value -> 'interactions_type' ->> 'num_rds') :: int >= 7;
-- select the port name, interactions_type -> num_wrts, interactions_dynamics -> rds_min where ineraction_dynamics -> rds_max > 20 ("p3,6,5")
---------------------------------------------------------------------------------------------------------------------------------------------
select
jpv.key,
(jpv.value -> 'interactions_type' ->> 'num_wrts') :: int,
(jpv.value -> 'interactions_dynamics' ->> 'rds_min') :: int
from
test t
cross join jsonb_array_elements(t.data -> 'ports') jp
cross join jsonb_each(jp) jpv
where
(jpv.value -> 'interactions_dynamics' ->> 'rds_max') :: int >= 20;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/363338.html
標籤:json PostgreSQL的
