2016-06-30 65 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,那么我只需添加一堆测试数据并运行一些基准测试即可! –