それを配列に変換します:
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つは、多くの役割が適用されることがわかっている場合に、基になるオーバーラップメソッドを直接呼び出すことです(これにより、1/3の選択性が得られ、潜在的なインデックススキャンは行われません)。
SELECT *
FROM MyTable
WHERE arrayoverlap(role_scan(MyRoles), array[1])