programing

포스트그레스가 배열에 없음

powerit 2023. 5. 8. 22:29
반응형

포스트그레스가 배열에 없음

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_arraynull이 아닙니다.배열이 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

반응형