- 카테고리:
반정형 및 정형 데이터 함수 (배열/오브젝트)
ARRAY_INTERSECTION¶
두 개의 입력 배열에서 일치하는 요소가 포함된 배열을 반환합니다.
이 함수는 NULL에 대해 안전합니다. 즉, NULL을 같음을 비교하기 위해 알려진 값으로 취급합니다.
- 참고 항목:
구문¶
ARRAY_INTERSECTION( <array1> , <array2> )
인자¶
array1
비교할 요소를 포함하는 배열입니다.
array2
비교할 요소를 포함하는 배열입니다.
반환¶
이 함수는 일치하는 입력 배열의 요소를 포함하는 ARRAY
를 반환합니다.
겹치는 요소가 없는 경우, 함수는 빈 배열을 반환합니다.
하나 또는 두 인자가 모두 NULL인 경우, 함수는 NULL을 반환합니다.
반환된 배열 내 값의 순서는 지정되지 않습니다.
사용법 노트¶
OBJECT
타입의 데이터를 비교할 때, 일치하는 것으로 간주하려면 오브젝트가 동일해야 합니다. 자세한 내용은 이 항목에 있는 예 를 참조하십시오.ARRAY_INTERSECTION
및 관련ARRAYS_OVERLAP
함수 사이의 차이점은ARRAYS_OVERLAP
함수는 단순히TRUE
또는FALSE
를 반환하는 반면,ARRAY_INTERSECTION
은 실제 중첩 값을 반환한다는 것입니다.Snowflake에서 배열은 세트가 아니라 다중 세트입니다. 즉, 배열에는 동일한 값의 여러 복사본이 포함될 수 있습니다.
ARRAY_INTERSECTION
은 다중 세트 의미 체계(때로는 “모음 의미 체계”라고도 함)를 사용하여 배열을 비교합니다. 이는 함수가 동일 값의 여러 복사본을 반환할 수 있음을 의미합니다. 한 배열에 값의 복사본이 N개 있고, 다른 배열에는 동일 값의 복사본이 M개 있는 경우, 반환된 배열의 복사본 수는 N 또는 M 중 작은 수입니다. 예를 들어, N이 4이고 M이 2인 경우, 반환된 값에는 2개의 복사본이 포함됩니다.
정형 ARRAY를 전달하는 경우:
함수는 두 입력 유형을 모두 수용할 수 있는 유형의 ARRAY를 반환합니다.
두 번째 인자의 ARRAY는 첫 번째 인자의 ARRAY와 비교 가능 해야 합니다.
예¶
이 예는 함수의 간단한 사용법을 보여줍니다.
SELECT array_intersection(ARRAY_CONSTRUCT('A', 'B'), ARRAY_CONSTRUCT('B', 'C')); +------------------------------------------------------+ | ARRAY_INTERSECTION(ARRAY_CONSTRUCT('A', 'B'), | | ARRAY_CONSTRUCT('B', 'C')) | |------------------------------------------------------| | [ | | "B" | | ] | +------------------------------------------------------+
세트에는 일치하는 값이 두 개 이상 있을 수 있습니다.
SELECT array_intersection(ARRAY_CONSTRUCT('A', 'B', 'C'), ARRAY_CONSTRUCT('B', 'C')); +------------------------------------------------------+ | ARRAY_INTERSECTION(ARRAY_CONSTRUCT('A', 'B', 'C'), | | ARRAY_CONSTRUCT('B', 'C')) | |------------------------------------------------------| | [ | | "B", | | "C" | | ] | +------------------------------------------------------+
동일한 일치 값의 인스턴스가 여러 개 있을 수 있습니다. 예를 들어, 아래 쿼리에서 한 배열에는 문자 ‘B’의 복사본이 세 개 있고, 다른 배열에는 문자 ‘B’의 복사본이 두 개 있습니다. 결과에는 두 개의 일치 항목이 포함됩니다.
SELECT array_intersection(ARRAY_CONSTRUCT('A', 'B', 'B', 'B', 'C'), ARRAY_CONSTRUCT('B', 'B')); +---------------------------------------------------------------+ | ARRAY_INTERSECTION(ARRAY_CONSTRUCT('A', 'B', 'B', 'B', 'C'), | | ARRAY_CONSTRUCT('B', 'B')) | |---------------------------------------------------------------| | [ | | "B", | | "B" | | ] | +---------------------------------------------------------------+
이 예는 더 많은 양의 데이터를 사용합니다.
CREATE OR REPLACE TABLE array_demo (ID INTEGER, array1 ARRAY, array2 ARRAY, tip VARCHAR); INSERT INTO array_demo (ID, array1, array2, tip) SELECT 1, ARRAY_CONSTRUCT(1, 2), ARRAY_CONSTRUCT(3, 4), 'non-overlapping'; INSERT INTO array_demo (ID, array1, array2, tip) SELECT 2, ARRAY_CONSTRUCT(1, 2, 3), ARRAY_CONSTRUCT(3, 4, 5), 'value 3 overlaps'; INSERT INTO array_demo (ID, array1, array2, tip) SELECT 3, ARRAY_CONSTRUCT(1, 2, 3, 4), ARRAY_CONSTRUCT(3, 4, 5), 'values 3 and 4 overlap'; INSERT INTO array_demo (ID, array1, array2, tip) SELECT 4, ARRAY_CONSTRUCT(NULL, 102, NULL), ARRAY_CONSTRUCT(NULL, NULL, 103), 'NULLs overlap'; INSERT INTO array_demo (ID, array1, array2, tip) SELECT 5, array_construct(object_construct('a',1,'b',2), 1, 2), array_construct(object_construct('a',1,'b',2), 3, 4), 'the objects in the array match'; INSERT INTO array_demo (ID, array1, array2, tip) SELECT 6, array_construct(object_construct('a',1,'b',2), 1, 2), array_construct(object_construct('b',2,'c',3), 3, 4), 'neither the objects nor any other values match'; INSERT INTO array_demo (ID, array1, array2, tip) SELECT 7, array_construct(object_construct('a',1, 'b',2, 'c',3)), array_construct(object_construct('c',3, 'b',2, 'a',1)), 'the objects contain the same values, but in different order';SELECT ID, array1, array2, tip, ARRAY_INTERSECTION(array1, array2) FROM array_demo WHERE ID <= 3 ORDER BY ID; +----+--------+--------+------------------------+------------------------------------+ | ID | ARRAY1 | ARRAY2 | TIP | ARRAY_INTERSECTION(ARRAY1, ARRAY2) | |----+--------+--------+------------------------+------------------------------------| | 1 | [ | [ | non-overlapping | [] | | | 1, | 3, | | | | | 2 | 4 | | | | | ] | ] | | | | 2 | [ | [ | value 3 overlaps | [ | | | 1, | 3, | | 3 | | | 2, | 4, | | ] | | | 3 | 5 | | | | | ] | ] | | | | 3 | [ | [ | values 3 and 4 overlap | [ | | | 1, | 3, | | 3, | | | 2, | 4, | | 4 | | | 3, | 5 | | ] | | | 4 | ] | | | | | ] | | | | +----+--------+--------+------------------------+------------------------------------+
다음은 NULL 값 사용법을 보여줍니다.
SELECT ID, array1, array2, tip, ARRAY_INTERSECTION(array1, array2) FROM array_demo WHERE ID = 4 ORDER BY ID; +----+--------------+--------------+---------------+------------------------------------+ | ID | ARRAY1 | ARRAY2 | TIP | ARRAY_INTERSECTION(ARRAY1, ARRAY2) | |----+--------------+--------------+---------------+------------------------------------| | 4 | [ | [ | NULLs overlap | [ | | | undefined, | undefined, | | undefined, | | | 102, | undefined, | | undefined | | | undefined | 103 | | ] | | | ] | ] | | | +----+--------------+--------------+---------------+------------------------------------+
이 예는 OBJECT
데이터 타입의 사용법을 보여줍니다.
SELECT ID, array1, array2, tip, ARRAY_INTERSECTION(array1, array2) FROM array_demo WHERE ID >= 5 and ID <= 7 ORDER BY ID; +----+-------------+-------------+-------------------------------------------------------------+------------------------------------+ | ID | ARRAY1 | ARRAY2 | TIP | ARRAY_INTERSECTION(ARRAY1, ARRAY2) | |----+-------------+-------------+-------------------------------------------------------------+------------------------------------| | 5 | [ | [ | the objects in the array match | [ | | | { | { | | { | | | "a": 1, | "a": 1, | | "a": 1, | | | "b": 2 | "b": 2 | | "b": 2 | | | }, | }, | | } | | | 1, | 3, | | ] | | | 2 | 4 | | | | | ] | ] | | | | 6 | [ | [ | neither the objects nor any other values match | [] | | | { | { | | | | | "a": 1, | "b": 2, | | | | | "b": 2 | "c": 3 | | | | | }, | }, | | | | | 1, | 3, | | | | | 2 | 4 | | | | | ] | ] | | | | 7 | [ | [ | the objects contain the same values, but in different order | [ | | | { | { | | { | | | "a": 1, | "a": 1, | | "a": 1, | | | "b": 2, | "b": 2, | | "b": 2, | | | "c": 3 | "c": 3 | | "c": 3 | | | } | } | | } | | | ] | ] | | ] | +----+-------------+-------------+-------------------------------------------------------------+------------------------------------+
배열에 있는 NULL 값은 비교 가능한 값으로 처리되지만, 배열 대신 NULL을 전달하면 결과는 NULL입니다.
SELECT array_intersection(ARRAY_CONSTRUCT('A', 'B'), NULL); +------------------------------------------------+ | ARRAY_INTERSECTION(ARRAY_CONSTRUCT('A', 'B'), | | NULL) | |------------------------------------------------| | NULL | +------------------------------------------------+