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과ANY
construct는 요소 유형을 왼쪽 오퍼랜드로 예상하며 플레인 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
.
예.
id = > uuid
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
'programing' 카테고리의 다른 글
Python의 목록 내에서 하위 문자열 찾기 (0) | 2023.04.13 |
---|---|
MVVM Light Toolkit을 사용하여 새 창을 여는 방법 (0) | 2023.04.13 |
체크아웃을 사용하지 않고 Git 브랜치 병합, 업데이트 및 풀 (0) | 2023.04.13 |
app.xaml에서 기본 WPF 창 스타일을 설정하는 방법 (0) | 2023.04.13 |
$(명령어)라는 명령어를 달러 기호와 괄호 안에 넣는 것은 셸에서 무엇을 의미합니까? (0) | 2023.04.13 |