ARRAY_COMPACT
array_compact
Описание
Удаляет повторяющиеся подряд элементы массива, сохраняя только первое вхождение каждого отличающегося значения. Функция обходит массив слева направо, пропускает элементы, совпадающие с предыдущим, и сохраняет только первое вхождение каждого значения.
Синтаксис
array_compact(ARRAY<T> arr)
Параметры
arr:массив типа ARRAY, из которого нужно удалить дубликаты. Поддерживаются имена столбцов и константные значения.
Поддерживаемые типы T:
- Числовые типы: TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL
- Строковые типы: CHAR, VARCHAR, STRING
- Типы даты и времени: DATE, DATETIME, DATEV2, DATETIMEV2, TIMESTAMP_NS
- Логический тип: BOOLEAN
- Типы IP-адресов: IPV4, IPV6
- UUID: UUID
- Сложные типы данных: ARRAY
Возвращаемое значение
Тип возвращаемого значения: ARRAY<T>
Смысл возвращаемого значения:
- Массив после удаления дубликатов, в котором сохранено только первое вхождение повторяющихся подряд элементов
- NULL: если входной массив равен NULL
Правила формирования возвращаемого значения:
-
Обычное удаление дубликатов:
- Массив обходится слева направо; сохраняется первое вхождение каждого элемента, а следующие подряд элементы, совпадающие с предыдущим, пропускаются
- Удаляются только повторяющиеся подряд элементы; дубликаты, расположенные не подряд, сохраняются
- Значения null сохраняются (null и null считаются одинаковыми)
-
Поведение в граничных случаях:
- Если входной массив пуст, возвращается пустой массив
- Если входной массив равен NULL, возвращается NULL
- Если массив содержит только один элемент, возвращается исходный массив
Примечания по использованию:
- Функция сохраняет исходный порядок элементов массива
- Удаляются только повторяющиеся подряд элементы; удаление дубликатов по всему массиву не выполняется
- Для map и struct логика удаления дубликатов не поддерживается
- Значения null в элементах массива обрабатываются обычным образом: несколько идущих подряд элементов null объединяются в один
Примеры
CREATE TABLE array_compact_test (
id INT,
int_array ARRAY<INT>,
string_array ARRAY<STRING>
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 3
PROPERTIES (
"replication_num" = "1"
);
INSERT INTO array_compact_test VALUES
(1, [1, 1, 2, 2, 2, 3, 1, 4], ['a', 'a', 'b', 'b', 'c']),
(2, [1, 2, 3, 1, 2, 3], ['a', 'b', 'a', 'b']),
(3, [1, null, null, 2, null, null, 3], ['a', null, null, 'b']),
(4, [], []),
(5, NULL, NULL);
Примеры запросов:
Удаление повторяющихся подряд элементов в string_array: удаляются только соседние дубликаты 'a' или 'b', а 'c' сохраняется.
SELECT array_compact(string_array) FROM array_compact_test WHERE id = 1;
+-----------------------------+
| array_compact(string_array) |
+-----------------------------+
| ["a", "b", "c"] |
+-----------------------------+
Дубликаты, расположенные не подряд, не удаляются; исходные порядок и содержимое сохраняются.
SELECT array_compact(int_array) FROM array_compact_test WHERE id = 2;
+-------------------------------+
| array_compact(int_array) |
+-------------------------------+
| [1, 2, 3, 1, 2, 3] |
+-------------------------------+
Массив со значениями null: из идущих подряд значений null сохраняется только одно. Значение null обрабатывается как обычное значение; несколько идущих подряд значений null объединяются в одно, а расположенные не подряд значения null не объединяются.
SELECT array_compact(int_array) FROM array_compact_test WHERE id = 3;
+------------------------------------------+
| array_compact(int_array) |
+------------------------------------------+
| [1, null, 2, null, 3] |
+------------------------------------------+
Примеры для сложных типов:
Удаление повторяющихся подряд элементов во вложенных массивах. Удаляются только соседние полностью одинаковые подмассивы; одинаковые подмассивы, расположенные не подряд, сохраняются.
SELECT array_compact([[1,2],[1,2],[3,4],[3,4]]);
+------------------------------------------+
| array_compact([[1,2],[1,2],[3,4],[3,4]]) |
+------------------------------------------+
| [[1,2],[3,4]] |
+------------------------------------------+
Для пустого массива возвращается пустой массив:
SELECT array_compact(int_array) FROM array_compact_test WHERE id = 4;
+----------------------+
| array_compact(int_array) |
+----------------------+
| [] |
+----------------------+
Для массива со значением NULL возвращается NULL:
SELECT array_compact(int_array) FROM array_compact_test WHERE id = 5;
+----------------------+
| array_compact(int_array) |
+----------------------+
| NULL |
+----------------------+
Для массива с единственным элементом возвращается исходный массив:
SELECT array_compact([42]);
+----------------------+
| array_compact([42]) |
+----------------------+
| [42] |
+----------------------+
Передача нескольких параметров приводит к ошибке.
SELECT array_compact([1,2,3],[4,5,6]);
ERROR 1105 (HY000): errCode = 2, detailMessage = Can not found function 'array_compact' which has 2 arity. Candidate functions are: [array_compact(Expression)]
Передача значения, не являющегося массивом, приводит к ошибке.
SELECT array_compact('not_an_array');
ERROR 1105 (HY000): errCode = 2, detailMessage = Can not find the compatibility function signature: array_compact(VARCHAR(12))
Ключевые слова
ARRAY, COMPACT, ARRAY_COMPACT