- 类别:
半结构化和结构化数据函数 (数组/对象)
ARRAY_EXCEPT¶
返回一个新 ARRAY,其中包含来自某个输入 ARRAY 且其他输入 ARRAY 中不含的元素。
该函数为 NULL-safe,意味着它将 NULLs 视作用于比较相等性的已知值。
- 另请参阅:
语法¶
ARRAY_EXCEPT( <source_array> , <array_of_elements_to_exclude> )
实参¶
source_array
一个数组,包含了要包含在新 ARRAY 中的元素。
array_of_elements_to_exclude
一个数组,包含了要从新 ARRAY 中排除的元素。
返回¶
此函数返回一个 ARRAY,其中包含了来自 source_array
但不在 array_of_elements_to_exclude
中的元素。
如果在从 source_array
中排除了 array_of_elements_to_exclude
中的元素后没有剩余元素,则函数返回一个空的 ARRAY。
如果一个或两个实参都是 NULL,则函数返回 NULL。
未指定返回数组中值的顺序。
使用说明¶
比较 OBJECT 类型的数据时,对象必须相同才能被视为匹配。有关详细信息,请参阅 示例 (本主题内容)。
在 Snowflake 中,数组是多重集合,而不是集合。换句话说,数组可以包含相同值的多个副本。
ARRAY_EXCEPT
使用多重集合语义(有时称为“包语义”)比较数组。如果source_array
包含某个值的多个副本,则该函数仅移除在array_of_elements_to_exclude
中指定的该值副本数。换句话说,如果
source_array
包含某个值的 N 个副本,而array_of_elements_to_exclude
包含同一个值的 M 个副本,则该函数会从返回的数组中排除该值的 M 个副本。在返回的数组中,该值的副本数为 N - M,如果 M 大于 N 则为 0。例如,如果
source_array
包含 5 个值为'A'
的元素,而array_of_elements_to_exclude
包含 2 个值为'A'
的元素,则返回的数组包含 3 个值为'A'
的元素。
两个实参必须是 结构化 ARRAYs 或 半结构化 ARRAYs。
如果要传入结构化 ARRAY:
第二个实参中的 ARRAY 必须与第一个实参中的 ARRAY 属于 同类。
该函数返回与第一个实参中的 ARRAY 相同类型的结构化 ARRAY。
示例¶
本部分中的示例使用 ARRAY 常量 和 OBJECT 常量 来指定 ARRAYs 和 OBJECTs。
下面的示例演示如何使用该函数:
SELECT ARRAY_EXCEPT(['A', 'B'], ['B', 'C']);
+--------------------------------------+
| ARRAY_EXCEPT(['A', 'B'], ['B', 'C']) |
|--------------------------------------|
| [ |
| "A" |
| ] |
+--------------------------------------+
下面的示例将元素 'C'
添加到 source_array
中。返回的 ARRAY 排除了 'C'
,原因是 array_of_elements_to_exclude
中也指定了 'C'
。
SELECT ARRAY_EXCEPT(['A', 'B', 'C'], ['B', 'C']);
+-------------------------------------------+
| ARRAY_EXCEPT(['A', 'B', 'C'], ['B', 'C']) |
|-------------------------------------------|
| [ |
| "A" |
| ] |
+-------------------------------------------+
在以下示例中,source_array
包含 3 个值为 'B'
的元素。由于 array_of_elements_to_exclude
仅包含 1 个 'B'
元素,因此该函数仅排除 1 个 'B'
元素,并返回包含另外 2 个 'B'
元素的 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
包含的 NULL 元素比 array_of_elements_to_exclude
多一个,因此,返回的 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 |
+--------------------------------+