Как запросить поля внутри нового типа данных 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
Обновление I
я собрал gist подробно, что в настоящее время возможно с 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.
- @Will опубликовал ссылку на блог, демонстрирующий новых операторов на в комментариях ниже..
ответ исходный вопрос в 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 пример
семя.rb
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)