[sql] PostgreSQL의 IN 대 ANY 연산자

PostgreSQL에서 INand ANY연산자 의 차이점은 무엇입니까 ?
두 가지의 작동 메커니즘은 동일한 것 같습니다. 누구든지 예를 들어 설명 할 수 있습니까?



답변

(또한 “연산자” 도 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;


답변

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

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

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

반면에 :

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

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

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


답변