PostgreSQL에서 IN
and ANY
연산자 의 차이점은 무엇입니까 ?
두 가지의 작동 메커니즘은 동일한 것 같습니다. 누구든지 예를 들어 설명 할 수 있습니까?
PostgreSQL에서 IN
and 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 mytable where id in (1, 2, 3)
항상와 동일한 행을 생성 한다는 것을 의미합니다 SELECT * from mytable where id = ANY('{1, 2, 3}')
.
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]))
예상대로 작동합니다.
ANY
와 결합 할 수 있습니다 !=
. 그러나 더 많은 것이 있습니다. 위의 장을 추가했습니다. ( <>
표준 SQL의 연산자입니다 !=
. Postgres에서도 허용됩니다.)
NULL
값 을 포함하는 마지막 버전은 어떻게 작동합니까? 겠습니까 WHERE id = ANY (ARRAY[1, 2]) OR id IS NULL;
마찬가지로 잘 작동?
(id = ...) IS NOT TRUE
되기 때문에 작동합니다 . 결과를 얻 거나 테스트를 통과합니다. 참조 : stackoverflow.com/a/23767625/939860 . 추가 한 표현은 다른 것을 테스트합니다. 이것은 동등합니다id = ...
TRUE
FALSE
NULL
WHERE id <> ALL (ARRAY[1, 2]) OR id IS NULL;