Перейти к содержимому
Последнее обновление

ARRAY_EXCEPT_ALL

array_except_all​

SinceVersion dev

Описание​

Возвращает разность мультимножеств arr1 и arr2. Каждое вхождение в arr2 удаляет не более одного равного ему вхождения из arr1; оставшиеся элементы, включая дубликаты, сохраняют исходный порядок. Элементы NULL сравниваются и удаляются по вхождениям, а если входной массив равен NULL, результат также равен NULL.

Синтаксис​

ARRAY_EXCEPT_ALL(<arr1>, <arr2>)

Параметры​

ПараметрОписание
<arr1>Первый массив. Тип его элементов должен быть поддерживаемым скалярным типом и быть совместимым с типом элементов <arr2>.
<arr2>Второй массив. Каждое его вхождение удаляет одно совпадающее вхождение из <arr1>. Тип его элементов должен быть поддерживаемым скалярным типом и быть совместимым с типом элементов <arr1>.

Поддерживаемые скалярные типы элементов включают числовые, логические и строковые типы, типы даты и времени, IPv4/IPv6 и UUID. Сложные типы элементов, такие как 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