PostgreSQL. Выборка по JSONB полю с использованием индекса.

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

PostgreSQL. Выборка по JSONB полю с использованием индекса.

Сообщение Joo » 27.06.2015 (Сб) 19:32

Добрый день, имеется следующая задача:
БД PostgreSQL, в таблице имеется JSONB поле, для него создан GIN индекс, в этом поле хранятся атрибуты продуктов: {"attrName1":"value1", "attrName2":"value2"} кол-во атрибутов и их названия заведомо неизвестны.

Необходимо организовать фильтр по атрибутам, пользователь выбирает галочками несколько значений для произвольного атрибута attrName1("value1", "value2", "value3",...).

Теперь собственно вопрос, как составить грамотно запрос, чтобы выборка происходила с учетом индексов?
... WHERE attributes->>'attrName1' IN ("value1","value2",...)
- ищет без индексов, если добавить attributes->>'attrName1' в индекс то ищет с индексами, но я не знаю наперед какие атрибуты будут,
...WHERE attributes @> '{"attrName1":"value1"}' - ищет с индексами но только по одному значению.

С PostgreSQL работаю совсем недавно, но в документации по своему вопросу ничего не нашел, а может плохо искал...
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: PostgreSQL. Выборка по JSONB полю с использованием индек

Сообщение iGrok » 28.06.2015 (Вс) 0:55

А вот это - не оно?
http://dba.stackexchange.com/questions/ ... json-array

Я имею в виду самый конец, решение для 9.4. Вроде бы синтаксис тот же, что у тебя, но ищут по двум атрибутам. С pg работал совсем мало, так что личного опыта по вопросу пока нет.
label:
cli
jmp label

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: PostgreSQL. Выборка по JSONB полю с использованием индек

Сообщение Joo » 28.06.2015 (Вс) 4:38

не совсем, мне надо по одному атрибуту, но по нескольким значениям attributes->>'attribute' IN (val1, val2, val3...)
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: PostgreSQL. Выборка по JSONB полю с использованием индек

Сообщение iGrok » 28.06.2015 (Вс) 7:08

А вариант с OR не прокатывает?
Т.е. как-то так: ... WHERE attributes @> '{"attrName1":"value1"}' OR attributes @> '{"attrName1":"value2"}' OR ....
label:
cli
jmp label

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: PostgreSQL. Выборка по JSONB полю с использованием индек

Сообщение Joo » 28.06.2015 (Вс) 17:49

iGrok писал(а):А вариант с OR не прокатывает?

Прокатит, я уже рассматривал такой вариант, но думал можно сочинить более красивое решение.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: PostgreSQL. Выборка по JSONB полю с использованием индек

Сообщение HandKot » 01.07.2015 (Ср) 8:20

Joo писал(а):Добрый день, имеется следующая задача:
БД PostgreSQL, в таблице имеется JSONB поле, для него создан GIN индекс, в этом поле хранятся атрибуты продуктов: {"attrName1":"value1", "attrName2":"value2"} кол-во атрибутов и их названия заведомо неизвестны.

Необходимо организовать фильтр по атрибутам, пользователь выбирает галочками несколько значений для произвольного атрибута attrName1("value1", "value2", "value3",...).

Теперь собственно вопрос, как составить грамотно запрос, чтобы выборка происходила с учетом индексов?
... WHERE attributes->>'attrName1' IN ("value1","value2",...)
- ищет без индексов, если добавить attributes->>'attrName1' в индекс то ищет с индексами, но я не знаю наперед какие атрибуты будут,
...WHERE attributes @> '{"attrName1":"value1"}' - ищет с индексами но только по одному значению.

С PostgreSQL работаю совсем недавно, но в документации по своему вопросу ничего не нашел, а может плохо искал...

С PostgreSQL не работал совсем, но работаю немного с СУБД. Для решения таких задач использую временную таблицу и JIOIN
т.е создаете временную таблицу #Values, закидываете туда ("value1", "value2", "value3")
и потом запрос
Код: Выделить всё
FROM MyTable MT
JOIN #Values V ON MT.attributes->>'attrName1'  = V.Value

я не уверен, что такой синтаксис допустим, хотел проверить, но SQL Fiddle не поддерживает PostgreSQL 9,4, а в 9,3 нет индексов GIN
I Have Nine Lives You Have One Only
THINK!


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

    TopList