Ответ 1
Postgres 9.2
Я цитирую Andrew Dunstan в списке pgsql-hackers:
На каком-то этапе, возможно, будет некоторая обработка json (в противовес к json-производным), но не в 9.2.
Не мешает ему предоставить пример реализации в PLV8, который должен решить вашу проблему.
Postgres 9.3
Предлагает арсенал новых функций и операторов для добавления "json-processing".
- Руководство по новым функциям JSON.
- The Postgres Wiki о новых функциях в pg 9.3.
- @Поделитесь ссылкой на блог, демонстрирующий новых операторов в комментариях ниже.
Ответ на исходный вопрос в Postgres 9.3:
SELECT *
FROM json_array_elements(
'[{"name": "Toby", "occupation": "Software Engineer"},
{"name": "Zaphod", "occupation": "Galactic President"} ]'
) AS elem
WHERE elem->>'name' = 'Toby';
Расширенный пример:
Для больших таблиц вы можете добавить индекс выражения для повышения производительности:
Postgres 9.4
Добавляет jsonb
(b для двоичных значений, значения хранятся как собственные типы Postgres), но еще больше функциональности для обоих типов. В дополнение к упомянутым выше индексам выражений jsonb
также поддерживает GIN, btree и хэш-индексы, причем наиболее важным из них является GIN.
- Руководство по
json
иjsonb
типам данных и functions. - The Postgres Wiki на JSONB в стр. 9.4
В руководстве говорится:
Как правило, большинство приложений предпочитают хранить данные JSON как
jsonb
, если нет особых потребностей, таких как наследие предположения о упорядочении ключей объектов.
Смелый акцент мой.
Преимущества производительности от общих улучшений индексов GIN.
Postgres 9.5
Завершить jsonb
функции и операторы. Добавьте дополнительные функции для управления jsonb
на месте и для отображения.