Как исключить из массива в postgresql?

Я хочу изменить условие в столбце массива call_type в запросе ниже, чтобы исключить все, что имеет "visit_occurred". Как мне работать с этой частью массива?

select staff_id,
   COUNT(event_id) as offered
from call_logs as logs
where visit_offered
and contact_date between now() - interval '1 weeks' and now()
and provider_type = 'Contractor'
and contact_with != 'company_staff'
and direction = 'outbound'
and outcome = 'Successful'
and call_type && array  ['Schedule','schedule_visit']
group by staff_id;
"исключает все, что имеет" visit_occurred "" немного нечеткий. Вы хотите сопоставить элементы массива точно или определить элементы, которые содержать заданной строки? И, пожалуйста, всегда раскройте свою версию Postgres.
Erwin Brandstetter 04.06.2018 19:36
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
427
1

Ответы 1

Чтобы просто сопоставить элементы массива в целом использовать ARRAY содержит оператор @>, инвертированный:

AND  NOT call_type @> '{schedule_visit}'::text[]

Обратите внимание на оболочку массива. Приведение к text[] обычно не требуется, но может помочь избежать двусмысленности.

Если столбец может быть NULL, и вы не хотите исключать такие строки:

AND  (call_type @> '{schedule_visit}'::text[]) IS NOT TRUE

Может поддерживаться индексом:

Сопоставление с образцом более сложный. Используйте выражение NOT EXISTS:

AND NOT EXISTS (
   SELECT FROM unnest(logs.call_type) call
   WHERE  call ILIKE '%visit_occurred%'  -- case insensitive?
   )

Для этого нет поддержки индекса. Связанный ответ для массива JSON (тот же принцип):

Альтернативой может быть нормализация столбца массива как отдельной таблицы n: 1.

Другие вопросы по теме