복붙노트

[SQL] 값이 포스트 그레스 배열에 존재하는지 확인

SQL

값이 포스트 그레스 배열에 존재하는지 확인

값이 지정된 배열에 존재하는지 포스트 그레스 9.0 사용하여, 나는이 시험 방법이 필요합니다. 지금까지 나는 이런 식으로 뭔가를 내놓았다 :

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

하지만 난 그냥 볼 수없는, 생각이에 대한 간단한 방법이 있어야 유지한다. 이것은 더 나은 것 같다 :

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

나는 그것이 충분하다 생각합니다. 당신이 그것을 할 수있는 다른 방법이있는 경우 그러나, 공유하시기 바랍니다!

해결법

  1. ==============================

    1.임의 구조와 간단한 :

    임의 구조와 간단한 :

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

    (괄호) ANY의 오른쪽 피연산자 중 하나 (예를 들면, 서브 쿼리의 결과) 집합 또는 배열 될 수있다. 그것을 사용하는 방법은 여러 가지가 있습니다 :

    중요한 차이점 : 배열 연산자 (<@ @> && 외.) 임의 구조는 왼쪽 피연산자 요소 타입을 예상하고 지원하지 않지만 PostgreSQL의 표준 분포 피연산자지지 진 또는 GIST 인덱스 들로서 배열 형 예상 이 지수. 예:

    이 중 어느 것도 NULL 요소 작동하지 않습니다. NULL을 테스트하려면 :

  2. ==============================

    2.특정 값이 배열에없는 경우에 의하면, 당신이 안 : 나는에있어 함정을 조심 :

    특정 값이 배열에없는 경우에 의하면, 당신이 안 : 나는에있어 함정을 조심 :

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

    하지만 사용

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

    대신.

  3. ==============================

    3.두 배열을 비교할 수 있습니다. 올바른 배열의 값 중복 왼쪽 배열에있는 값의 경우는 true를 돌려줍니다. 그것은 일종의 hackish의,하지만 그것을 작동합니다.

    두 배열을 비교할 수 있습니다. 올바른 배열의 값 중복 왼쪽 배열에있는 값의 경우는 true를 돌려줍니다. 그것은 일종의 hackish의,하지만 그것을 작동합니다.

    SELECT '{1}'   && '{1,2,3}'::int[];  -- true
    SELECT '{1,4}' && '{1,2,3}'::int[];  -- true
    SELECT '{4}'   && '{1,2,3}'::int[];  -- false
    
  4. ==============================

    4.unnest도 사용할 수 있습니다. 이 일련의 행으로 배열을 확장하고 단순히 값을 확인하여 존재 여부 IN 또는 NOT IN을 사용하여 단순하게된다.

    unnest도 사용할 수 있습니다. 이 일련의 행으로 배열을 확장하고 단순히 값을 확인하여 존재 여부 IN 또는 NOT IN을 사용하여 단순하게된다.

    EG

    ID가 NOT IN (표 2에서) unnest (exception_list_ids를 선택) 여기서 테이블에서 선택 *

  5. ==============================

    5.어레이 내의 요소의 존재를보고하면, 적절한 캐스팅 POSTGRES의 SQL 파서를 통과 할 필요가있다. 여기서 배열을 이용한 일례 쿼리 절 조인 연산자를 포함하다 :

    어레이 내의 요소의 존재를보고하면, 적절한 캐스팅 POSTGRES의 SQL 파서를 통과 할 필요가있다. 여기서 배열을 이용한 일례 쿼리 절 조인 연산자를 포함하다 :

    단순화를 위해 나는 단지 관련 부분을 목록 :

    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)
    

    난 그냥 구문 분석 컬럼의 정확한 유형을 파악하기 위해 테이블 ​​정의를 패치 할 필요가 없기 때문에 여분의 캐스팅이 필요하다는 것을 추측하고있다. 다른 사람들은 이것에 코멘트를하시기 바랍니다.

  6. from https://stackoverflow.com/questions/11231544/check-if-value-exists-in-postgres-array by cc-by-sa and MIT license