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
는 올바른 배열에 있습니다. true
값4
이 올바른 배열에 포함되어 있지 않더라도 두 번째 쿼리는입니다 .- 세 번째 쿼리의 경우 왼쪽 배열 (즉,
4
)의 값 이 오른쪽 배열에 없으므로 반환합니다.false
답변
unnest
사용할 수 있습니다. 이 일련의 행으로 배열을 확장하고 단순히 값을 확인하여 존재 여부를 이용하여 간단 같다 IN
나 NOT IN
.
예 :
-
아이디 => UUID
-
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에서 *를 선택하십시오.