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
- Логический тип: BOOLEAN
- Типы IP: IPV4, IPV6
- Сложные типы данных: 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 объединяются в одно, а расположенные не подряд не объединяются.
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