포스트그레스가 배열에 없음
Postgres의 네이티브 어레이 유형을 사용하고 있으며, 어레이 수신자 ID에 ID가 없는 레코드를 찾고 있습니다.
위치를 찾을 수 있습니다.
SELECT COUNT(*) FROM messages WHERE (3 = ANY (recipient_ids))
하지만 이것은 효과가 없습니다.
SELECT COUNT(*) FROM messages WHERE (3 != ANY (recipient_ids))
SELECT COUNT(*) FROM messages WHERE (3 = NOT ANY (recipient_ids))
이 상태를 테스트하는 올바른 방법은 무엇입니까?
SELECT COUNT(*) FROM "messages" WHERE NOT (3 = ANY (recipient_ids))
당신은 언제나 부정할 수 있습니다.WHERE (condition)
와 함께WHERE NOT (condition)
조금 돌려서 "3은 모든 ID와 같지 않습니다."라고 말할 수 있습니다.
where 3 != all (recipient_ids)
상세 설명서에서:
9.21.4. 모두(어레이)
expression operator ALL (array expression)
오른쪽은 괄호로 묶인 표현식이며, 이 표현식은 배열 값을 생성해야 합니다.왼쪽 식은 평가되고 주어진 연산자를 사용하여 배열의 각 요소와 비교되며, 이는 부울 결과를 생성해야 합니다.의 결과
ALL
모든 비교 결과가 참이면 "참"입니다(어레이에 요소가 0개인 경우 포함).잘못된 결과가 발견되면 결과는 "false"입니다.
NULL 주의
둘다요.ALL
:
(some_value != ALL(some_array))
그리고.ANY
:
NOT (some_value = ANY(some_array))
가능한 한 오래 작동할 것입니다.some_array
null이 아닙니다.배열이 null일 수 있는 경우 병합() 등으로 설명해야 합니다.
(some_value != ALL(coalesce(some_array, array[]::int[])))
또는
NOT (some_value = ANY(coalesce(some_array, array[]::int[])))
문서에서:
배열 식이 null 배열을 생성하면 ANY의 결과는 null이 됩니다.
배열 식이 null 배열을 생성하면 ALL의 결과는 null이 됩니다.
추가 기능ALL/ANY
답들
사용하는 모든 솔루션을 선호합니다.all
또는any
결과를 달성하기 위해 추가 노트(예: NULL)를 감사합니다.또 다른 평가로서, 이러한 연산자에 대해 생각해 볼 수 있는 방법이 있습니다.
단락 연산자라고 생각할 수 있습니다.
all(array)
는 제공된 연산자를 사용하여 각 값을 기준 값과 비교하여 배열의 모든 값을 살펴봅니다.비교 결과가 나오는 즉시false
프로세스가 거짓으로 종료되고 그렇지 않으면 참입니다. (단락 논리에 비유)and
.)any(array)
는 제공된 연산자를 사용하여 각 값을 기준 값과 비교하여 배열의 모든 값을 살펴봅니다.비교 결과가 나오는 즉시true
프로세스가 true로 종료되고 그렇지 않으면 false로 종료됩니다.(단락 논리와 비교 가능)or
.)
이것이 이유입니다.3 <> any('{1,2,3}')
원하는 결과가 나오지 않습니다.이 공정은 부등식에 대해 3을 1과 비교하여 참이며, 즉시 참을 반환합니다.배열의 값이 3과 다를 경우 전체 조건을 만족시키기에 충분합니다.마지막 배열 위치의 3은 확률입니다.미사용의
3 <> all('{1,2,3}')
반면에 모든 값이 3이 아닌지 확인합니다.거짓을 산출하는 요소(이 경우 마지막 요소)까지 참을 산출하는 모든 비교를 실행하여 전체 결과로 거짓을 반환합니다.이것이 OP가 원하는 것입니다.
업데이트:
포스트그레스 9.3 기준,
사용할 수 있습니다.NOT
와함께와 하여.@>
이를 달성하기 위해서도 마찬가지입니다.
IE.
SELECT COUNT(*) FROM "messages" WHERE NOT recipient_ids @> ARRAY[3];
not (3 = any(recipient_ids))
?
ANY/ALL 연산자는 배열 인덱스에서 작동하지 않습니다.인덱스를 염두에 둔 경우:
SELECT COUNT(*) FROM "messages" WHERE 3 && recipient_ids
그리고 부정적인 것:
SELECT COUNT(*) FROM "messages" WHERE NOT (3 && recipient_ids)
그런 다음 다음과 같은 인덱스를 만들 수 있습니다.
CREATE INDEX recipient_ids_idx on tableName USING GIN(recipient_ids)
예제에서 다음 쿼리 선택 ID를 사용합니다(ID = ANY('{1, 2}').
언급URL : https://stackoverflow.com/questions/11730777/postgres-not-in-array
'programing' 카테고리의 다른 글
git mv 및 디렉토리의 대소문자만 변경 (0) | 2023.05.08 |
---|---|
어떻게 하면 항상 특정 지점에서 끌어낼 수 있을까요? (0) | 2023.05.08 |
nvm을 사용하여 npm 버전을 변경하려면 어떻게 해야 합니까? (0) | 2023.05.08 |
클릭 이벤트가 동적으로 생성된 요소에서 작동하지 않음 (0) | 2023.05.08 |
linq를 사용하여 고유 선택 (0) | 2023.05.08 |