Как запросить поля внутри нового типа данных 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 довольно редкий:

Обновление 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-обработка".

ответ исходный вопрос в 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 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)