2016-06-30 2 views
1

PostgreSQL имеет некоторые родные JSON operations, так как verison 9.3. Предположим, у вас есть таблица, my_table с json колонны, my_json_col, структурирована следующим образом:Извлечь первые N записей массива JSON с запросом Postgresql

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

Для получения п-й элемент my_json_col, вы должны выполнить что-то вроде: 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, я бы просто добавил кучу тестовых данных и запустил некоторые тесты! –

Смежные вопросы