2017-05-09 105 views
0

我很難查詢jsonb數據。我不習慣在postgres中處理jsonb類型。是否有可能在jsonb字段上執行哪裏在PostgreSQL - 在JSONB中的位置

我有這樣

id | act | act_id |  from_ids  |  object_ids  | post_date 
2 post  1  {"2":"1494308197"} {"items":["104564"]} 1494308197 

數據我試圖做這樣的事情下面找到在from_ids的列,其中ID是關鍵任何標識。

SELECT an.* FROM activity_network an, jsonb_each(an.from_ids) d WHERE d.key->> in ('2'); 

但顯然這是行不通的。我嘗試了各種形式。

我找到一個類似的question,但它不適合我需要的,因爲它得到的值,我需要key使用IN

不知道如何使用這些jsonb函數。

回答

1

它比簡單得多:

SELECT an.* 
FROM activity_network an 
WHERE an.from_ids ?| ARRAY['2']; 

the documentation

下指數能夠加快這樣一個查詢:

CREATE INDEX ON activity_network USING gin (from_ids); 
+0

那麼看看那個。這很簡單。幾個小時一直在敲我的頭。感謝您的快速!如果數組中有多個項目,似乎沒有使用杜松子酒索引。你會碰巧知道這是否可以索引? –

+0

我已經擴展了包含該信息的答案。如果你沒有看到使用的索引,也許PostgreSQL認爲順序掃描更便宜。您可以'SET enable_seqscan = off'來測試是否可以使用索引*。 –

0

可以使用jsonb_exists函數,該函數。

SELECT an.* FROM activity_network an WHERE jsonb_exists(an.from_ids,'2'); 

the PG documentation映射到該函數描述的?運算符。如果您使用PHP,Java或C + libpq以外的任何其他語言,我建議您使用它,因爲世界上每個人都同意?代表位置參數,但Postgres團隊除外。

+0

所以我實際上沒有在文檔中看到這個函數。你在哪裏找到它? –

+0

您可以在psql控制檯中運行'\ doS +'來找到它。當你有+時,它只會列出相應的功能。這是幾頁下來。 – coladict