Как я могу запросить использование полей в новом типе данных PostgreSQL JSON?

Я ищу некоторые документы и/или примеры для новых функций JSON в PostgreSQL 9.2.

В частности, учитывая серию записей JSON:

[
  {name: "Toby", occupation: "Software Engineer"},
  {name: "Zaphod", occupation: "Galactic President"}
]

Как мне написать SQL, чтобы найти запись по имени?

В vanilla SQL:

SELECT * from json_data WHERE "name" = "Toby"

Официальное руководство для разработчиков довольно редкое:

Обновление I

Я собрал подробное описание того, что в настоящее время возможно с 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

Ответ 1

Postgres 9.2

Я цитирую Andrew Dunstan в списке pgsql-hackers:

На каком-то этапе, возможно, будет некоторая обработка json (в противовес к json-производным), но не в 9.2.

Не мешает ему предоставить пример реализации в PLV8, который должен решить вашу проблему.

Postgres 9.3

Предлагает арсенал новых функций и операторов для добавления "json-processing".

Ответ на исходный вопрос в 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, если нет особых потребностей, таких как наследие предположения о упорядочении ключей объектов.

Смелый акцент мой.

Преимущества производительности от общих улучшений индексов GIN.

Postgres 9.5

Завершить jsonb функции и операторы. Добавьте дополнительные функции для управления jsonb на месте и для отображения.

Ответ 3

С postgres 9.3 use → для доступа к объекту. 4 пример

seed.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)