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

ARRAY_EXCEPT_ALL

array_except_all​

SinceVersion 4.1.0

Описание​

Возвращает разность мультимножеств arr1 и arr2. Каждое вхождение элемента в arr2 удаляет не более одного равного ему вхождения из 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