2014-07-16 3 views
0

Array 테이블의 Users 테이블에 roles 필드가 있습니다. 나는 역할 'admin'과 역할 'member'를 모두 가지고있는 모든 사용자를 얻을 수 있어야한다. 이 작업을 수행 할 수있는 청소기 방법이 있다면 궁금 해서요여러 값에 대한 쿼리 배열 필드

select * from users where 'member' = ANY(roles) and 'admin' = ANY(roles);

: 지금 나는이 쿼리를 사용합니다.

답변

1

를 사용하여 배열에 포함-에 의해 운영자 @< :

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

즉, 당신이 너무 인덱스 조회를 드리겠습니다.

(@bereal 당 보정, 내가 질문을 오해)

아니면 그들이 모두 권한이 사용해야하는 것을 의미하는 경우, && 배열을-겹치는 :

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

또한, 사용자의 입력 회전 등 out이 varchar[] (테이블 정의를 표시하지 않음) 인 경우 배열 형식 사이에 암시 적 캐스트가 없기 때문에 배열 입력을 varchar[]으로 변환해야합니다.

+1

"member '= ANY (역할) 또는'admin '= ANY (역할)'과 동일하므로"<@'일명 "은"에 포함됩니다. – bereal

+0

그 방법을 사용하면 다음과 같은 결과를 얻습니다 : ERROR : 연산자가 존재하지 않습니다 : text [] && character varying [] –

+0

@yossarian 명시 적으로 캐스팅해야하므로'text []'에서'varchar [] '까지 암시 적 캐스트가 없습니다. 편집을 참조하십시오. –