Programing

Postgres 배열에 값이 있는지 확인

crosscheck 2020. 6. 2. 22:13
반응형

Postgres 배열에 값이 있는지 확인


주어진 배열에 값이 있는지 테스트하는 방법이 필요합니다. 지금까지 나는 이와 같은 것을 생각해 냈습니다.

select '{1,2,3}'::int[] @> (ARRAY[]::int[] || value_variable::int)

그러나 나는 이것에 대한 더 간단한 방법이 있어야한다고 생각합니다. 나는 그것을 볼 수 없습니다.

편집 : 방금 내가 이것을 할 수 있다는 것을 깨달았습니다.

select '{1,2,3}'::int[] @> ARRAY[value_variable::int]

이것은 훨씬 낫고 충분하다고 생각하지만 다른 방법이 있다면 공유하십시오.


와 간단한 ANY구조 :

SELECT value_variable = ANY ('{1,2,3}'::int[])

오른쪽 피연산자 ANY(괄호는) 중 어느 하나 일 수있다 (예를 들면, 서브 쿼리의 결과) 세트 또는 배열 . 여러 가지 방법으로 사용할 수 있습니다.

중요한 차이 : 배열 연산자 ( <@, @>. 등) 예상 배열 피연산자와 같은 유형의 지지 진 또는 GIST 인덱스 그동안, PostgreSQL의 표준 분포를 ANY구조가 예상 소자 피연산자 좌측 이러한 인덱스를 지원하지 않는 타입. 예:

이 중 어느 것도 NULL요소에 적용되지 않습니다. 테스트하려면 NULL:


내가 잡은 함정을 조심하십시오 : 특정 값이 배열에 존재하지 않는지 확인할 때 다음을 수행해서는 안됩니다.

SELECT value_variable != ANY('{1,2,3}'::int[])

하지만 사용

SELECT value_variable != ALL('{1,2,3}'::int[])

대신에.


그러나 다른 방법이 있다면 공유하십시오.

두 배열을 비교할 수 있습니다. 왼쪽 배열의 값 중 하나가 오른쪽 배열의 값과 겹치면 true를 반환합니다. 일종의 해킹이지만 작동합니다.

SELECT '{1}'   && '{1,2,3}'::int[];  -- true
SELECT '{1,4}' && '{1,2,3}'::int[];  -- true
SELECT '{4}'   && '{1,2,3}'::int[];  -- false
  • 첫 번째 쿼리와 두 번째 쿼리에서 value 1는 올바른 배열에 있습니다.
  • true4이 올바른 배열에 포함되어 있지 않더라도 두 번째 쿼리는입니다 .
  • 세 번째 쿼리의 경우 왼쪽 배열 (즉, 4)의 이 오른쪽 배열에 없으므로 반환합니다.false

unnest사용할 수 있습니다. 이 일련의 행으로 배열을 확장하고 단순히 값을 확인하여 존재 여부를 이용하여 간단 같다 INNOT IN.

예 :

  1. 아이디 => UUID

  2. exception_list_ids => uuid []

select * from table where id NOT IN (select unnest(exception_list_ids) from table2)


배열에 요소가 있는지 찾을 때 postgres의 SQL 파서를 전달하려면 적절한 캐스팅이 필요합니다. 다음은 join 절에서 array contains 연산자를 사용하는 쿼리 예입니다.

간단히하기 위해 관련 부분 만 나열합니다.

table1 other_name text[]; -- is an array of text

표시된 SQL의 결합 부분

from table1 t1 join table2 t2 on t1.other_name::text[] @> ARRAY[t2.panel::text]

다음은 또한 작동합니다

on t2.panel = ANY(t1.other_name)

구문 분석에서 열의 정확한 유형을 파악하기 위해 테이블 ​​정의를 가져올 필요가 없기 때문에 추가 캐스팅이 필요하다고 생각합니다. 다른 사람들은 이것에 의견을주십시오.

참고 URL : https://stackoverflow.com/questions/11231544/check-if-value-exists-in-postgres-array

반응형