我在roles
类Users
表中有一个Array
字段。我需要能够让所有同时拥有“admin”角色和“角色”成员的用户。现在我使用这个查询:
select * from users where 'member' = ANY(roles) and 'admin' = ANY(roles);
我想知道是否有更清洁的方法来做到这一点。
答案 0 :(得分:3)
使用array-contained-by运算符@<
:
select * from users where ARRAY['member','admin']::varchar[] <@ roles;
也可以让您为查找编制索引。
(@bereal的修正;我误读了这个问题)
或者,如果您的意思是他们必须拥有这两项权利,请使用数组重叠&&
:
select * from users where ARRAY['member','admin']::varchar[] && roles;
此外,由于您的输入结果为varchar[]
(您没有显示您的表定义),您必须将数组输入转换为varchar[]
,因为那里有数组类型之间没有隐式转换。