Преобразуйте его в массив:
SELECT *
FROM MyTable
WHERE ('{' || MyRoles || '}')::int[] && array[1]
Еще лучше, вы можете использовать индекс для вышеупомянутого беспорядка.Непосредственное приведение текста к типу массива будет отклонено при построении массива, но вы можете обойти его:
create function role_scan(text) returns int[] as $$
select ('{' || $1 || '}')::int[];
$$ language sql immutable strict;
create index on MyTable using gin (role_scan(MyRoles));
-- actually use the index
SELECT *
FROM MyTable
WHERE role_scan(MyRoles) && array[1]
При добавлении индекса есть предостережение, о котором вы должны знать.Сборщик статистики не просматривает (в любом случае, до 9,1) фактические значения массива.Избирательность оператора перекрытия (1/200, т. Е. Очень избирательная) жестко запрограммирована для всех целей и задач.Поэтому, если вы запрашиваете очень распространенные значения, вы можете получить сканирование индекса там, где это неуместно.Одним из обходных путей является непосредственный вызов базового метода перекрытия (который обеспечивает избирательность 1/3 и отсутствие потенциального сканирования индекса), когда известно, что применяется множество ролей:
SELECT *
FROM MyTable
WHERE arrayoverlap(role_scan(MyRoles), array[1])