#sql #json #postgresql #where-clause #jsonb
#sql #json #postgresql #where-предложение #jsonb
Вопрос:
У меня есть postgres db с таблицей электронной почты, в которой есть столбец jsonb для хранения того, кому отправляются электронные письма. Если электронное письмо отправляется одному человеку, оно сохраняется как
{"name": "bob", "email": "bob@email.com"}
Я могу запросить это, выполнив
select * from email where (to->>'address') = 'bob@email.com';
Если электронное письмо было отправлено более чем одному человеку, оно сохраняется как:
[{"email": "bob@email.com"}, {"email": "dave@email.com"}]
И я могу запросить для этого, например:
select * from email where to @> '[{"email": "bob@email.com"}]';
Мне интересно, есть ли у кого-нибудь идеи для одного запроса, который возвращал бы результаты обоих сценариев.
Ответ №1:
Вы могли бы использовать jsonb_typeof()
:
select *
from email
where
(jsonb_typeof(to) = 'object' and to->>'address' = 'bob@email.com')
or (jsonb_typeof(to) = 'array' and to @> '[{"email": "bob@email.com"}]')