ARRAY_EXCEPT
ARRAY_EXCEPT
ARRAY_EXCEPT() 함수는 한 입력 ARRAY에 있지만 다른 입력 ARRAY에는 없는 요소를 담은 새 ARRAY를 반환해요.
이 함수는 NULL 안전(NULL-safe)해서, 동등성 비교 시 NULL을 알려진 값으로 취급해요.
본문
문법
ARRAY_EXCEPT( <source_array> , <array_of_elements_to_exclude> )
인자
source_array — 새 ARRAY에 포함할 요소를 담은 배열이에요.
array_of_elements_to_exclude — 새 ARRAY에서 제외할 요소를 담은 배열이에요.
반환
이 함수는 source_array에 있지만 array_of_elements_to_exclude에는 없는 요소를 담은 ARRAY를 반환해요.
source_array에서 array_of_elements_to_exclude의 요소를 제외한 뒤 남는 요소가 없으면 함수는 빈 ARRAY를 반환해요.
인자 중 하나 또는 둘 다 NULL이면 함수는 NULL을 반환해요.
반환된 배열 안의 값 순서는 지정되지 않아요.
사용 노트
- OBJECT 타입의 데이터를 비교할 때는 객체가 동일해야(identical) 일치로 간주돼요. 자세한 내용은 이 토픽의 Examples 참고.
- Snowflake에서 배열은 집합(set)이 아니라 다중 집합(multi-set)이에요. 즉 배열은 같은 값을 여러 개 담을 수 있어요.
- ARRAY_EXCEPT은 다중 집합 의미(multi-set semantics, "bag semantics"라고도 함)로 배열을 비교해요.
source_array에 어떤 값이 여러 개 있으면, 함수는array_of_elements_to_exclude에 지정된 그 값의 복사본 수만 제거해요. - 즉
source_array에 어떤 값이 N개 있고array_of_elements_to_exclude에 같은 값이 M개 있으면, 함수는 반환 배열에서 그 값의 M개를 제외해요. 반환 배열에 남는 그 값의 개수는 N - M이며, M이 N보다 크면 0이에요. - 예를 들어
source_array에 값 'A'가 5개 있고array_of_elements_to_exclude에 값 'A'가 2개 있으면, 반환 배열에는 값 'A'가 3개 있어요. - 두 인자는 모두 구조화(structured) ARRAY이거나 반정형(semi-structured) ARRAY여야 해요.
- 구조화 ARRAY를 전달한다면:
- 두 번째 인자의 ARRAY는 첫 번째 인자의 ARRAY와 비교 가능해야 해요.
- 함수는 첫 번째 인자의 ARRAY와 같은 타입의 구조화 ARRAY를 반환해요.
예제
이 섹션의 예제들은 ARRAY 상수와 OBJECT 상수를 사용해 ARRAY와 OBJECT를 지정해요.
다음 예제는 함수 사용법을 보여줘요:
SELECT ARRAY_EXCEPT(['A', 'B'], ['B', 'C']);
+--------------------------------------+
| ARRAY_EXCEPT(['A', 'B'], ['B', 'C']) |
|--------------------------------------|
| [ |
| "A" |
| ] |
+--------------------------------------+
다음 예제는 source_array에 요소 'C'를 추가해요. array_of_elements_to_exclude에도 'C'가 지정되어 있으므로 반환 ARRAY는 'C'를 제외해요.
SELECT ARRAY_EXCEPT(['A', 'B', 'C'], ['B', 'C']);
+-------------------------------------------+
| ARRAY_EXCEPT(['A', 'B', 'C'], ['B', 'C']) |
|-------------------------------------------|
| [ |
| "A" |
| ] |
+-------------------------------------------+
다음 예제에서 source_array는 값 'B'가 3개 있어요. array_of_elements_to_exclude에는 'B'가 1개만 있으므로, 함수는 'B' 1개만 제외하고 나머지 'B' 2개를 담은 ARRAY를 반환해요.
SELECT ARRAY_EXCEPT(['A', 'B', 'B', 'B', 'C'], ['B']);
+------------------------------------------------+
| ARRAY_EXCEPT(['A', 'B', 'B', 'B', 'C'], ['B']) |
|------------------------------------------------|
| [ |
| "A", |
| "B", |
| "B", |
| "C" |
| ] |
+------------------------------------------------+
다음 예제에서 source_array에서 array_of_elements_to_exclude의 요소를 제외한 뒤 남는 요소가 없어요. 결과적으로 함수는 빈 ARRAY를 반환해요.
SELECT ARRAY_EXCEPT(['A', 'B'], ['A', 'B']);
+--------------------------------------+
| ARRAY_EXCEPT(['A', 'B'], ['A', 'B']) |
|--------------------------------------|
| [] |
+--------------------------------------+
다음 예제는 함수가 NULL 요소를 알려진 값으로 취급하는 방법을 보여줘요. 앞서 설명했듯이 source_array가 array_of_elements_to_exclude보다 NULL 요소를 하나 더 갖고 있으므로, 반환 ARRAY는 NULL 하나만 제외하고 나머지(undefined로 출력)를 포함해요.
SELECT ARRAY_EXCEPT(['A', NULL, NULL], ['B', NULL]);
+----------------------------------------------+
| ARRAY_EXCEPT(['A', NULL, NULL], ['B', NULL]) |
|----------------------------------------------|
| [ |
| "A", |
| undefined |
| ] |
+----------------------------------------------+
다음 예제에서 source_array와 array_of_elements_to_exclude는 같은 수의 NULL 요소를 가지므로 반환 ARRAY는 NULL 요소들을 제외해요.
SELECT ARRAY_EXCEPT(['A', NULL, NULL], [NULL, 'B', NULL]);
+----------------------------------------------------+
| ARRAY_EXCEPT(['A', NULL, NULL], [NULL, 'B', NULL]) |
|----------------------------------------------------|
| [ |
| "A" |
| ] |
+----------------------------------------------------+
다음 예제는 source_array와 array_of_elements_to_exclude에 같은 객체를 지정하면 그 객체가 반환 ARRAY에서 제외되는 것을 보여줘요:
SELECT ARRAY_EXCEPT([{'a': 1, 'b': 2}, 1], [{'a': 1, 'b': 2}, 3]);
+------------------------------------------------------------+
| ARRAY_EXCEPT([{'A': 1, 'B': 2}, 1], [{'A': 1, 'B': 2}, 3]) |
|------------------------------------------------------------|
| [ |
| 1 |
| ] |
+------------------------------------------------------------+
다음 예제는 NULL을 전달하면 함수가 NULL을 반환하는 것을 보여줘요.
SELECT ARRAY_EXCEPT(['A', 'B'], NULL);
+--------------------------------+
| ARRAY_EXCEPT(['A', 'B'], NULL) |
|--------------------------------|
| NULL |
+--------------------------------+