Оператор выбора столбца Postgres JSONB, который обрабатывает записи массива и нет записей массива

#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"}]')