类别:

半结构化和结构化数据函数 (数组/对象)

ARRAY_EXCEPT

返回一个新 ARRAY,其中包含来自某个输入 ARRAY 且其他输入 ARRAY 中不含的元素。

该函数为 NULL-safe,意味着它将 NULLs 视作用于比较相等性的已知值。

另请参阅:

ARRAY_INTERSECTION

语法

ARRAY_EXCEPT( <source_array> , <array_of_elements_to_exclude> )
Copy

实参

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' 的元素。

  • 如果要传入结构化 ARRAY:

    • 第二个实参中的 ARRAY 必须与第一个实参中的 ARRAY 属于 同类

    • 该函数返回与第一个实参中的 ARRAY 相同类型的结构化 ARRAY。

示例

本部分中的示例使用 ARRAY 常量OBJECT 常量 来指定 ARRAYs 和 OBJECTs。

下面的示例演示如何使用该函数:

SELECT ARRAY_EXCEPT(['A', 'B'], ['B', 'C']);

+--------------------------------------+
| ARRAY_EXCEPT(['A', 'B'], ['B', 'C']) |
|--------------------------------------|
| [                                    |
|   "A"                                |
| ]                                    |
+--------------------------------------+
Copy

下面的示例将元素 '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"                                     |
| ]                                         |
+-------------------------------------------+
Copy

在以下示例中,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"                                          |
| ]                                              |
+------------------------------------------------+
Copy

在以下示例中,从 source_array 中排除了 array_of_elements_to_exclude 中的元素后没有剩余元素。因此,该函数返回一个空 ARRAY。

SELECT ARRAY_EXCEPT(['A', 'B'], ['A', 'B']);

+--------------------------------------+
| ARRAY_EXCEPT(['A', 'B'], ['A', 'B']) |
|--------------------------------------|
| []                                   |
+--------------------------------------+
Copy

下面的示例演示该函数如何将 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                                  |
| ]                                            |
+----------------------------------------------+
Copy

在以下示例中,source_arrayarray_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"                                              |
| ]                                                  |
+----------------------------------------------------+
Copy

在以下示例中,可以看到在 source_arrayarray_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                                                        |
| ]                                                          |
+------------------------------------------------------------+
Copy

下面的示例演示传入 NULL 会导致该函数返回 NULL。

SELECT ARRAY_EXCEPT(['A', 'B'], NULL);

+--------------------------------+
| ARRAY_EXCEPT(['A', 'B'], NULL) |
|--------------------------------|
| NULL                           |
+--------------------------------+
Copy
语言: 中文