2016-06-30 87 views
1

自從版本9.3以來,PostgreSQL具有一些本機JSON operations。假設你有一個表,my_table,具有jsonmy_json_col,結構如下:使用Postgresql查詢檢索JSON數組的前N條記錄

[ 
    { "id": 1, "some_field": "blabla" }, 
    { "id": 2, "some_field": "foo" } 
    ... 
] 

要檢索的my_json_col的第n個元素,可以執行類似:SELECT my_json_col->n FROM my_table WHERE ...。因此,如果n = 1,查詢將返回我的示例中的"id": 2記錄。

我想檢索前n個元素,例如如果n = 2查詢應該返回我的示例中的前兩個記錄。這可能嗎?

回答

2

我想你需要convert the JSON array to a regular Postgres array,然後利用它的一個切片:

select (array_agg(e))[2:3] 
from (select json_array_elements('[{"id":1},{"id":2},{"id":3},{"id":4}]'::json)) x(e); 

如果你需要得到的結果是JSON,您可以使用array_to_json

select array_to_json((array_agg(e))[2:3]) 
from (select json_array_elements('[{"id":1},{"id":2},{"id":3},{"id":4}]'::json)) x(e); 
+0

這工作。我需要這個主要原因是因爲性能 - 我可能正在處理一些巨大的JSON。關於'array_agg'和'json_array_elements'性能的任何想法?因爲如果整個JSON列被加載到內存中,那麼我需要考慮其他的東西。 – brito

+0

我也對這種性能影響感興趣。有沒有人試過這個規模? –

+0

就個人而言,如果你有很長的陣列,我對perf的表現並不樂觀。我懷疑Postgres可以避免加載整個事情作爲第1步。如果你只需要選擇一些元素,那麼我會去一個更傳統的基於表格的結構。但是如果你真的有動力將它全部保存爲JSON,那麼我只需添加一堆測試數據並運行一些基準測試即可! –