У меня есть таблица для хранения информации о моих кроликах. Выглядит это так:
create table rabbits (rabbit_id bigserial primary key, info json not null);
insert into rabbits (info) values
('{"name":"Henry", "food":["lettuce","carrots"]}'),
('{"name":"Herald","food":["carrots","zucchini"]}'),
('{"name":"Helen", "food":["lettuce","cheese"]}');
Как найти кроликов, которые любят морковь? Я придумал это:
select info->>'name' from rabbits where exists (
select 1 from json_array_elements(info->'food') as food
where food::text = '"carrots"'
);
Мне не нравится этот запрос. Это беспорядок.
У меня, как у кроликовода, занятого полный рабочий день, нет времени менять схему базы данных. Я просто хочу как следует кормить своих кроликов. Есть ли более понятный способ выполнить этот запрос?
json
postgresql
postgresql-9.3
Снежный шар
источник
источник
Ответы:
Начиная с PostgreSQL 9.4, вы можете использовать
?
оператор :Вы даже можете проиндексировать
?
запрос по"food"
ключу, если вместо этого переключитесь на тип jsonb :Конечно, у вас, как у кроликовода, занятого полный рабочий день, на это нет времени.
Обновление: вот демонстрация улучшения производительности на столе из 1000000 кроликов, где каждый кролик любит два продукта, а 10% из них любят морковь:
источник
select * from rabbits where info->'food' != '[]';
create table t (x jsonb); insert into t (x) values ('[1,2,3]'), ('[2,3,4]'), ('[3,4,5]'); select * from t where x @> '2';
. Обратите внимание, что'2'
это номер JSON; не вводите в заблуждение цитаты.Вы можете использовать оператор @>, чтобы сделать что-то вроде
источник
'
галочки, окружающие «морковь» ... он сломается, если вы не укажете их, даже если вы проверяете целое число. (потратил 3 часа, пытаясь найти целое число,'
'
Для формирования строки должно быть значение json, окруженное галочками , потому что все является строкой для SQL в типе JSONB. Например, логическое значение:'true'
, строка:'"example"'
, целое число:'123'
.Не умнее, а проще:
источник
Небольшая вариация, но ничего нового. Здесь действительно отсутствует функция ...
источник