- 类别:
半结构化和结构化数据函数 (数组/对象)
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 |
+--------------------------------+