跳到主要内容
最后 更新

ARRAY_EXCEPT_ALL

array_except_all

SinceVersion 4.1.0

描述

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

语法

ARRAY_EXCEPT_ALL(<arr1>, <arr2>)

参数

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

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

返回值

返回 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