복붙노트

[SQL] 포스트 그레스 - 기능이 개 배열의 교회법을 반환?

SQL

포스트 그레스 - 기능이 개 배열의 교회법을 반환?

PostgreSQL을, 당신은 두 배열은 일반 회원이있는 경우 반환 t (참), 즉 사람들을 중복으로 && 연산자를 사용할 수 있습니다. 그 공통 회원이 무엇 반환하는 함수 / 연산자가 있습니까?

이 같은 즉, 뭔가

select arrray_intersection(ARRAY[1, 4, 2], ARRAY[2, 3]);
ARRAY[2]

해결법

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

    1.8.4 이후, (EXPLAIN 무엇의 어쨌든, 나에게 말한다 것을 쉽고 가능한 빨리 첫 번째 대답에서 기능을 포스트 그레스에 유용한 내장 매크로가있다 : "(비용 = 0.00..0.07 행 = 폭 = 64 1)"이 쿼리 대에 대한 . 「비용 (= 0.00..60.02 행 폭 = 1 = 64) "원래의 경우).

    8.4 이후, (EXPLAIN 무엇의 어쨌든, 나에게 말한다 것을 쉽고 가능한 빨리 첫 번째 대답에서 기능을 포스트 그레스에 유용한 내장 매크로가있다 : "(비용 = 0.00..0.07 행 = 폭 = 64 1)"이 쿼리 대에 대한 . 「비용 (= 0.00..60.02 행 폭 = 1 = 64) "원래의 경우).

    단순화 된 코드는 다음과 같습니다

    SELECT ARRAY
        (
            SELECT UNNEST(a1)
            INTERSECT
            SELECT UNNEST(a2)
        )
    FROM  (
            SELECT  array['two', 'four', 'six'] AS a1
                  , array['four', 'six', 'eight'] AS a2
          ) q;
    

    그리고 그래, 당신은 기능으로 바꿀 수 있습니다 :

    CREATE FUNCTION array_intersect(anyarray, anyarray)
      RETURNS anyarray
      language sql
    as $FUNCTION$
        SELECT ARRAY(
            SELECT UNNEST($1)
            INTERSECT
            SELECT UNNEST($2)
        );
    $FUNCTION$;
    

    이는 당신이로 호출 할 수 있습니다

    SELECT array_intersect(array['two', 'four', 'six']
                         , array['four', 'six', 'eight']);
    

    하지만 당신은 단지뿐만 아니라 너무 인라인 호출 할 수 있습니다 :

     SELECT array(select unnest(array['two', 'four', 'six']) intersect
                  select unnest(array['four', 'six', 'eight']));
    
  2. ==============================

    2.& 대신 시도 &&

    & 대신 시도 &&

    이상 PostgreSQL의 문서를 참조하십시오.

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

    3.하나의 다른 방법 ..

    하나의 다른 방법 ..

    SELECT ARRAY( SELECT * FROM UNNEST( $1 ) WHERE UNNEST = ANY( $2 ) );
    
  4. ==============================

    4.당신이 확장 기능을 설치 마음을하지 않는 경우, intarray 확장 & 연산자가 @dwc 지적 아웃으로이 일을 제공합니다 :

    당신이 확장 기능을 설치 마음을하지 않는 경우, intarray 확장 & 연산자가 @dwc 지적 아웃으로이 일을 제공합니다 :

    SELECT ARRAY[1, 4, 2] & ARRAY[2, 3];
    

    반환 {2}.

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

    5.이 기능을 사용할 수 있습니다 :

    이 기능을 사용할 수 있습니다 :

    CREATE OR REPLACE FUNCTION intersection(anyarray, anyarray) RETURNS anyarray as $$
    SELECT ARRAY(
        SELECT $1[i]
        FROM generate_series( array_lower($1, 1), array_upper($1, 1) ) i
        WHERE ARRAY[$1[i]] && $2
    );
    $$ language sql;
    

    이 배열의 모든 종류의 작업을해야합니다, 당신은 다음과 같이 사용할 수 있습니다 :

    SELECT intersection('{4,2,6}'::INT4[], '{2,3,4}'::INT4[]);
    
  6. ==============================

    6.

    SELECT  ARRAY
            (
            SELECT  a1[s]
            FROM    generate_series(array_lower(a1, 1), array_upper(a1, 1)) s
            INTERSECT
            SELECT  a2[s]
            FROM    generate_series(array_lower(a2, 1), array_upper(a2, 1)) s
            )
    FROM    (
            SELECT  array['two', 'four', 'six'] AS a1, array['four', 'six', 'eight'] AS a2
            ) q
    

    너무 정수가 아닌 배열에서 작동합니다.

  7. from https://stackoverflow.com/questions/756871/postgres-function-to-return-the-intersection-of-2-arrays by cc-by-sa and MIT license