跳到主要内容
最后于 更新

ARRAY_EXCEPT_ALL

array_except_all​

SinceVersion 4.1.0

描述​

返回 arr1 和 arr2 的多重集差集。arr2 中的每个元素最多抵消 arr1 中一个相同的元素;未被抵消的元素(包括重复元素)按照 arr1 的原始顺序保留。数组元素中的 NULL 也按出现次数进行比较和抵消;如果任一输入数组为 NULL,则返回 NULL。

语法​

ARRAY_EXCEPT_ALL(<arr1>, <arr2>)

参数​

参数说明
<arr1>第一个数组。元素必须为支持的标量类型,且必须与 <arr2> 的元素类型兼容。
<arr2>第二个数组。其中每次出现的元素会抵消 <arr1> 中一个相同的元素;元素必须为支持的标量类型,且必须与 <arr1> 兼容。

支持的标量元素类型包括数值、布尔、字符串、日期时间以及 IPv4/IPv6 类型。不支持 ARRAY、MAP、STRUCT、JSON 和 VARIANT 等复杂元素类型。

返回值​

返回 ARRAY<T>,包含 <arr1> 中剩余的元素,并保持其原始顺序。如果任一输入数组为 NULL,返回 NULL;如果没有剩余元素,返回空数组。

示例​

基本多重集差集:

SELECT array_except_all([1, 1, 2, 3], [1, 3]);
[1, 2]

元素按出现次数逐个抵消,未匹配的重复元素会保留:

SELECT array_except_all(['a', 'a', 'b'], ['a']);
["a", "b"]

结果保持第一个数组的顺序:

SELECT array_except_all([3, 1, 3, 2], [3]);
[1, 3, 2]

数组中的 NULL 参与多重集差集运算:

SELECT array_except_all(['a', NULL, 'a', NULL], [NULL]);
["a", "a", null]

任一输入数组为 NULL 时返回 NULL:

SELECT array_except_all(CAST(NULL AS ARRAY<INT>), [1]);
NULL

第二个数组为空时,第一个数组保持不变:

SELECT array_except_all([1, 1, 2], CAST([] AS ARRAY<INT>));
[1, 1, 2]

与 array_except 不同,本函数会保留剩余的重复元素:

SELECT array_except([1, 1, 2], [1]), array_except_all([1, 1, 2], [1]);
[2]    [1, 2]

不支持复杂元素类型:

SELECT array_except_all([[1], [2]], [[1]]);
ERROR 1105 (HY000): array_except_all does not support types

关键词​

ARRAY、EXCEPT、MULTISET、ARRAY_EXCEPT_ALL