Query array field for multiple values

postgresql

Solution

Use the array-contained-by operator `@<`:

select * from users where ARRAY['member','admin']::varchar[] <@ roles;

That'll let you index the lookup too.

(Correction per @bereal; I misread the question)

Or, if you meant that they must have both rights, use array-overlaps `&&`:

select * from users where ARRAY['member','admin']::varchar[] && roles;

Also, as your input turns out to be `varchar[]` (you didn't show your table definition), you must cast the array input to `varchar[]` too, as there's no implicit cast between array types.

Problem

I have a `roles` field in a `Users` table of type `Array`. I need to be able to get all users that have both role 'admin' and role 'member'. FOr now I use this query: `select * from users where 'member' = ANY(roles) and 'admin' = ANY(roles);` I was wondering if there was a cleaner way to do this.

Original source