Я хочу изменить условие в столбце массива 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;


Чтобы просто сопоставить элементы массива в целом использовать 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.