Вы можете использовать диапазон с оператором , например:
select id
from my_table
where '[2,4]'::int4range @> any(col)
К сожалению, запрос не использует индекс. Я не думаю, что вы можете найти запрос, который делает это (без определения вашего собственного оператора).
Обновить. Вы можете попытаться преобразовать диапазон в массив.
create or replace function int_range_to_array(int4range)
returns int[] language sql immutable as $$
select array(
select i
from generate_series(lower($1), upper($1)- 1) i)
$$;
select id
from my_table
where col && int_range_to_array('[2,4]');
Очевидно, что производительность зависит от размеров диапазона.