表中有列,名為“config”,內容如下:
{
"A":{
"B":[
{"name":"someName","version":"someVersion"},
{"name":"someName","version":"someVersion"}
]
}
}
任務是選擇所有名稱和版本值。輸出是包含 2 列的預期選擇:名稱和值。
我成功選擇了B的內容:
select config::json -> 'A' -> 'B' as B
from my_table;
但是當我嘗試執行以下操作時:
select config::json -> 'A' -> 'B' ->> 'name' as name,
config::json -> 'A' -> 'B' ->> 'version' as version
from my_table;
我收到帶有空值列的選擇
uj5u.com熱心網友回復:
如果陣列大小是固定的,您只需要告訴您要檢索陣列的哪個元素,例如:
SELECT config->'A'->'B'->0->>'name' AS name,
config->'A'->'B'->0->>'version' AS version
FROM my_table;
但是由于您的陣列包含多個元素,請jsonb_array_elements在子查詢或 CTE 中使用該函式,并在外部查詢中單獨決議每個元素,例如:
SELECT rec->>'name', rec->>'version'
FROM (SELECT jsonb_array_elements(config->'A'->'B')
FROM my_table) j (rec);
演示: db<>fiddle
uj5u.com熱心網友回復:
首先,您應該使用 jsonb 資料型別而不是 json,請參閱檔案:
一般來說,大多數應用程式應該更喜歡將 JSON 資料存盤為 jsonb,除非有非常特殊的需求,例如關于物件鍵排序的遺留假設。
使用 jsonb,您可以執行以下操作:
SELECT DISTINCT ON (c) c->'name' AS name, c->'version' AS version
FROM my_table
CROSS JOIN LATERAL jsonb_path_query(config :: jsonb, '$.** ? (exists(@.name))') AS c
uj5u.com熱心網友回復:
資料庫小提琴
select e.value ->> 'name', e.value ->> 'version'
from
my_table cross join json_array_elements(config::json -> 'A' -> 'B') e
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/337119.html
標籤:sql json PostgreSQL
上一篇:如何使用typeorm從3個相互依賴的表中選擇資料?
下一篇:如何復制與另一列相關的列
