2 回答

TA貢獻1725條經(jīng)驗 獲得超8個贊
json 在Postgres 9.3+
使用子句json_array_elements()中的橫向連接中的函數(shù)來對JSON數(shù)組進行Unnest FROM并測試其元素:
WITH reports(data) AS (
VALUES ('{"objects":[{"src":"foo.png"}, {"src":"bar.png"}]
, "background":"background.png"}'::json)
)
SELECT *
FROM reports r, json_array_elements(r.data#>'{objects}') obj
WHERE obj->>'src' = 'foo.png';
該CTE(WITH查詢)只是替代了一張桌子reports。
或者,相當(dāng)于只是一個單一的嵌套層次:
SELECT *
FROM reports r, json_array_elements(r.data->'objects') obj
WHERE obj->>'src' = 'foo.png';
->>,->和#>運營商的說明書中介紹。
兩個查詢都使用隱式JOIN LATERAL。
SQL小提琴。
密切相關(guān)的答案:
在JSON列中查詢數(shù)組元素
jsonb 在Postgres 9.4+
使用等效的jsonb_array_elements()。
更好的是,使用新的“包含”運算符@>(最好結(jié)合表達式上匹配的GIN索引data->'objects'):
CREATE INDEX reports_data_gin_idx ON reports
USING gin ((data->'objects') jsonb_path_ops);
SELECT * FROM reports WHERE data->'objects' @> '[{"src":"foo.png"}]';
由于密鑰objects包含JSON 數(shù)組,因此我們需要匹配搜索項中的結(jié)構(gòu)并將數(shù)組元素包裝到方括號中。搜索普通記錄時刪除數(shù)組括號。
詳細說明和更多選項:
用于在JSON數(shù)組中查找元素的索引
添加回答
舉報