programing

Postgre의 IN 대 ANY 연산자SQL

abcjava 2023. 6. 10. 07:54
반응형

Postgre의 IN 대 ANY 연산자SQL

사이의 차이점은 무엇입니까?IN그리고.ANYPostgreSQL의 연산자?
두 가지의 작동 메커니즘은 동일한 것으로 보입니다.이것을 예를 들어 설명할 수 있는 사람이 있습니까?

(엄밀히 말하면,IN그리고.ANYPostgres는 "연산자"가 아닌 "구문" 또는 "구문 요소"입니다.)

논리적으로 설명서인용합니다.

IN와 동등합니다.= ANY.

하지만 두 가지 구문 변형이 있습니다.IN그리고 두 가지 변형의ANY.세부사항:

IN 세트를 가져가는 것은= ANY여기에 설명된 것처럼 세트를 취합니다.

하지만 각각의 두 번째 변종은 미묘하게 다릅니다.두 번째 변형 모델은ANY구성은 배열(실제 배열 유형이어야 함)을 사용하는 반면, 두 번째 변형은IN쉼표로 구분된 값 목록을 사용합니다.이로 인해 전달 값이 서로 다른 제한을 받게 되며 특별한 경우에는 다음과 같은 쿼리 계획이 서로 다를 수도 있습니다.

ANY보다 다양한 용도로 사용

ANY구성은 단순한 것이 아니라 다양한 연산자와 결합될 수 있기 때문에 훨씬 더 다용도입니다.=예:

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

많은 값의 경우 각 값에 대해 더 나은 스케일을 제공합니다.

관련:

반전/반대/제외

"행 찾기 위치id지정된 배열에 있음":

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

반전: "열에 없는찾기":

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}'));

세 가지 모두 동등합니다.첫 번째는 어레이 생성자를 사용하고 나머지 두 개는 어레이 리터럴을 사용합니다.입력되지 않은 배열 리터럴의 유형은 왼쪽에 있는 (알려진) 요소 유형에서 파생됩니다.
다른 별자리(입력한 배열 값 / 기본이 아닌 유형에 대해 다른 유형 / 배열 생성자를 원하는 경우)에서는 명시적으로 캐스트해야 할 수 있습니다.

의 행은 이러한 식을 모두 전달하지 않습니다.포함하기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목록에서 작동하지 않습니다.

'in'구문은 설탕입니다. 계획 분석을 검토할 수 있으며 '에서'를 확인할 수 있습니다.'으로 됩니다.=ANY('...,...')::yourType[]

언급URL : https://stackoverflow.com/questions/34627026/in-vs-any-operator-in-postgresql

반응형