programing

Postgres 배열에 값이 있는지 확인합니다.

topblog 2023. 4. 13. 20:28
반응형

Postgres 배열에 값이 있는지 확인합니다.

Postgres 9.0을 사용하여 지정된 배열에 값이 있는지 테스트할 수 있는 방법이 필요합니다.지금까지 생각해낸 것은 다음과 같습니다.

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

하지만 더 간단한 방법이 있을 거라고 계속 생각하고 있어요. 도저히 이해가 안 돼요.이게 더 나은 것 같아요.

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

그걸로 충분할 것 같아요.하지만 다른 방법이 있다면 공유해주세요!

보다 심플한 구조:

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

적절한 오퍼랜드ANY(괄호 사이)는 세트(서브쿼리의 결과 등) 또는 배열 중 하나입니다.다음과 같은 여러 가지 방법으로 사용할 수 있습니다.

중요한 차이:어레이 연산자(,<@ , 등)는 어레이 유형을 오퍼랜드로 예상하고 Postgre의 표준 분포에서 GIN 또는 GiST 인덱스를 지원합니다.SQL과ANYconstruct는 요소 유형을 왼쪽 오퍼랜드로 예상하며 플레인 B-트리 인덱스로 지원할 수 있습니다(연산자의 왼쪽에 인덱스된 식을 사용하여 예시와 같이 반올림하지 않습니다).예:

이 중 어느 것도 효과가 없습니다.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
  • 첫 번째 쿼리와 두 번째 쿼리에서 값은1올바른 배열에 있습니다.
  • 두 번째 쿼리는true단, 이 값은4올바른 배열에 포함되지 않음
  • 세 번째 쿼리의 경우 왼쪽 배열에 값이 없습니다(예:4)가 올바른 배열에 있기 때문에 반환됩니다.false

unnest 사용할 수 있습니다.어레이를 일련의 행으로 확장하여 값의 유무를 확인하는 것만으로IN또는NOT IN.

예.

  1. id = > uuid

  2. exception_list_ids => uuid[]

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

안녕하세요, 저한텐 잘 먹히네요, 누군가에게는 도움이 될지도 몰라요.

select * from your_table where array_column ::text ilike ANY (ARRAY['%text_to_search%'::text]);

"Any"가 잘 통합니다.any 키워드가 등호 오른쪽에 있는지 확인합니다.즉, 등호 뒤에 있습니다.

다음 문에서는 오류 발생: ERROR: 구문 오류 "any" 또는 "any"에 가깝습니다.

select 1 where any('{hello}'::text[]) = 'hello';

단, 아래 예시는 정상적으로 동작합니다.

select 1 where 'hello' = any('{hello}'::text[]);

배열에 요소가 존재하는지 확인할 때 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)

파스가 열의 정확한 유형을 계산하기 위해 테이블 정의를 가져올 필요가 없기 때문에 추가 캐스팅이 필요할 것으로 추측합니다.다른 분들도 댓글 달아주세요.

@ErwinBrandstetter가 수락한 답변에 대한 추가 메모:singe 값과 비교할 때 배열 열의 인덱스를 활용하려면 다음과 같이 배열로 값을 줄 바꿈할 수 있습니다.

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

다음과 같은 경우 매개 변수를 사용할 때 어레이 유형을 캐스팅해야 할 수 있습니다.

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

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

반응형