ARRAY_EXCEPT

ARRAY_EXCEPT

ARRAY_EXCEPT() 함수는 한 입력 ARRAY에 있지만 다른 입력 ARRAY에는 없는 요소를 담은 새 ARRAY를 반환해요.

이 함수는 NULL 안전(NULL-safe)해서, 동등성 비교 시 NULL을 알려진 값으로 취급해요.

출처: Snowflake SQL Reference

본문

문법

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                           |
+--------------------------------+

더 알아보기 (Learn more)