Postgres - поиск в json массиве элементов - PullRequest
0 голосов
/ 08 марта 2020

Моя таблица:

id | имя | open_days

Столбец open_days - это столбец json со следующей структурой:

{
daysOfWeek: ['mon','tue','sat']
months: ['may','november']
}

Я хотел бы найти строки, в которых daysOfWeek содержит поисковый элемент. Что-то вроде

SELECT * FROM places WHERE :day=ANY(open_days->'daysOfWeek') 

Но приведенный выше запрос неверен. Пожалуйста, помогите, как искать это json массив.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 08 марта 2020

Если open_days - это столбец jsonb (который должен быть), тогда вы можете использовать оператор содержимого ?:

select *
from places
where open_days -> 'daysOfWeek' ? :day

Если это столбец json, вам нужно для приведения open_days::jsonb -> ...


Если вы хотите найти значения, содержащие несколько дней недели, вы можете использовать оператор ?&:

select *
from places
where open_days -> 'daysOfWeek' ?& array['mon','tue']

, приведенное выше вернет все строки, содержащие mon и tue

1 голос
/ 08 марта 2020

Одним из способов является использование json_array_elements().

SELECT *
       FROM places
       WHERE :day = ANY (SELECT json_array_elements(open_days->'daysOfWeek')#>>'{}');
0 голосов
/ 08 марта 2020

Еще один способ сделать это - использовать оператор удержания.

select * from places where open_days @> '{"daysOfWeek":["mon"]}'

Преимущество по сравнению с -> ... ? заключается в том, что в сдерживании может использоваться индекс JSONB по умолчанию, в то время как для другого потребуется специальный индекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...