PostgreSQL의 IN 대 ANY 연산자


답변:


158

(또한 "연산자" 도 IN아닙니다 ANY. "구성"또는 "구문 요소".)

논리적으로 , 매뉴얼을 인용하면 :

IN와 동일합니다 = ANY.

그러나 두 가지가 변형 구문IN와의 두 변종 ANY. 세부:

IN 복용하는 설정은 동일합니다 = ANY복용하는 설정을 여기에 입증 된 바와 같이, :

그러나 각각의 두 번째 변형은 서로 동일하지 않습니다. 두번째의 변형 ANY구조가 얻어 어레이 의 두 번째 변형하면서, (실제 어레이 형이어야) IN콤마 분리 소요 값리스트 . 값을 전달하고 다른 제한이 리드 할 수 도 특별한 경우 다른 쿼리 계획을 초래할 :

ANY 더 다재다능하다

ANY구조는 .NET뿐만 아니라 다양한 연산자와 결합 할 수 있으므로 훨씬 더 다양 =합니다. 예:

SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');

큰 값의 번호, 제공하는 세트 각각에 대해 더 나은 저울 :

관련 :

반전 / 반대 / 배제

" id주어진 배열에있는 행 찾기 ":

SELECT * FROM tbl WHERE id = ANY (ARRAY[1, 2]);

반전 : "행 찾기 id입니다 하지 배열을"

SELECT * FROM tbl WHERE id <> ALL (ARRAY[1, 2]);
SELECT * FROM tbl WHERE id <> ALL ('{1, 2}');  -- equivalent array literal
SELECT * FROM tbl WHERE NOT (id = ANY ('{1, 2}'));

세 가지 모두 동일합니다. 첫 번째는 배열 생성자 를 사용하고 다른 두 개는 배열 리터럴을 사용 합니다. 데이터 유형은 컨텍스트에서 명확하게 파생 될 수 있습니다. 그렇지 않으면 '{1,2}'::int[].

가있는 행 id IS NULL은 이러한 표현식 중 하나를 전달하지 않습니다. NULL값을 추가로 포함하려면 :

SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;

4
두 번째 변형의 결과가 항상 동일하다는 것을 명시 적으로 명확히하는 것이 좋습니다. 나는 그것이 사실이라고 99 % 확신하지만 대답은 그것을 언급하지 않는 것 같다. 이는 잠재적으로 다른 쿼리 계획을 가질 수 있더라도 SELECT * from mytable where id in (1, 2, 3)항상와 동일한 행을 생성 한다는 것을 의미합니다 SELECT * from mytable where id = ANY('{1, 2, 3}').
KPD

1
ANY !=연산자 와 결합 할 수 없습니다 . 나는 그것을 문서화 생각하지,하지만 않습니다 select * from foo where id != ANY (ARRAY[1, 2])동일하지 않습니다 select * from foo where id NOT IN (1, 2). 반면에 select * from foo where NOT (id = ANY (ARRAY[1, 2]))예상대로 작동합니다.
qris

1
@qris : 연산자 ANY와 결합 할 수 있습니다 !=. 그러나 더 많은 것이 있습니다. 위의 장을 추가했습니다. ( <>표준 SQL의 연산자입니다 !=. Postgres에서도 허용됩니다.)
Erwin Brandstetter

NULL값 을 포함하는 마지막 버전은 어떻게 작동합니까? 겠습니까 WHERE id = ANY (ARRAY[1, 2]) OR id IS NULL;마찬가지로 잘 작동?
dvtan

1
@dvtan : 실제 일치하는 경우 에만 평가 (id = ...) IS NOT TRUE되기 때문에 작동합니다 . 결과를 얻 거나 테스트를 통과합니다. 참조 : stackoverflow.com/a/23767625/939860 . 추가 한 표현은 다른 것을 테스트합니다. 이것은 동등합니다id = ...TRUEFALSENULLWHERE id <> ALL (ARRAY[1, 2]) OR id IS NULL;
Erwin Brandstetter

3

두 가지 분명한 점과 다른 답변의 요점이 있습니다.

  • 하위 쿼리를 사용할 때 정확히 동일합니다.

    SELECT * FROM table
    WHERE column IN(subquery);
    
    SELECT * FROM table
    WHERE column = ANY(subquery);

반면에 :

  • IN연산자 만 간단한 목록을 허용합니다.

    SELECT * FROM table
    WHERE column IN(… ,  , …);

그것들이 똑같다고 가정하면 ANY목록에서 작동하지 않는 것을 잊었을 때 여러 번 나를 붙 잡았습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.