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

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

Обновить я

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

В 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 примера

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

рельсы с

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)
Другие вопросы по тегам