[sql] Postgres 배열에 값이 있는지 확인

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

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)

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


답변

안녕 하나는 나를 위해 잘 작동, 아마도 누군가에게 유용

array_column :: text ilike ANY (ARRAY [ ‘% text_to_search %’:: text]); your_table에서 *를 선택하십시오.


답변