Как сделать запрос с использованием полей внутри нового типа данных PostgreSQL JSON?
Я ищу некоторые документы и / или примеры для новых функций JSON в PostgreSQL 9.2.
в частности, учитывая серию записей JSON:
[
{name: "Toby", occupation: "Software Engineer"},
{name: "Zaphod", occupation: "Galactic President"}
]
как бы я написал SQL, чтобы найти запись по имени?
в ванильном SQL:
SELECT * from json_data WHERE "name" = "Toby"
официальное руководство dev довольно редкий:
- http://www.postgresql.org/docs/devel/static/datatype-json.html
- http://www.postgresql.org/docs/devel/static/functions-json.html
Я
я собрал суть подробно то, что в настоящее время возможно с PostgreSQL 9.2. Используя некоторые пользовательские функции, можно делать такие вещи, как:
SELECT id, json_string(data,'name') FROM things
WHERE json_string(data,'name') LIKE 'G%';
обновление II
у меня есть теперь переместил мои функции JSON в свой собственный проект:
PostSQL - набор функций для преобразования PostgreSQL и PL / v8 в совершенно удивительный JSON хранилище документов
3 ответа:
Postgres 9.2
цитата Эндрю Данстан в списке pgsql-хакеров:
на каком-то этапе, возможно, будет некоторая JSON-обработка (в отличие от в JSON-производство) функции, но не в 9.2.
не мешает ему обеспечивать пример реализации в PLV8 что должно решить вашу проблему.
Postgres 9.3
предлагает арсенал новых функций и операторы для добавления "json-обработка".
- руководство по новой функциональности JSON.
- Вики Postgres о новых функциях в 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
поддерживает Джин, btree и хэш-индексы, Джин является самым мощным из них.
- руководство
json
иjsonb
типы данных и функции.- Вики Postgres на JSONB в pg 9.4
руководство идет так далеко, как сказать:
в общем, большинство приложений должны предпочитать хранить данные JSON в виде
jsonb
, если есть достаточно специализированных потребностей, таких, как наследие предположения о порядке ключей объектов.жирным выделено мной.
преимущества производительности от общего улучшения индексов Джина.
Postgres 9.5
полное
jsonb
функции и операторы. Добавьте дополнительные функции для управленияjsonb
в место и для показа.
С Postgres 9.3+, просто используйте
->
оператора. Например,
SELECT data->'images'->'thumbnail'->'url' AS thumb FROM instagram;
см.http://clarkdave.net/2013/06/what-can-you-do-with-postgresql-and-json/ для некоторых хороших примеров и учебник.
С помощью postgres 9.3 - > для доступа к объекту. 4 пример
семя.РБ
se = SmartElement.new se.data = { params: [ { type: 1, code: 1, value: 2012, description: 'year of producction' }, { type: 1, code: 2, value: 30, description: 'length' } ] } se.save
рельсы c
SELECT data->'params'->0 as data FROM smart_elements;
возвращает
data ---------------------------------------------------------------------- {"type":1,"code":1,"value":2012,"description":"year of producction"} (1 row)
вы можете продолжить вложенность
SELECT data->'params'->0->'type' as data FROM smart_elements;
возвращение
data ------ 1 (1 row)