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

ARRAY_COMPACT

array_compact​

SinceVersion 2.0.0

Описание​

Удаляет повторяющиеся подряд элементы массива, сохраняя только первое вхождение каждого отличающегося значения. Функция обходит массив слева направо, пропускает элементы, совпадающие с предыдущим, и сохраняет только первое вхождение каждого значения.

Синтаксис​

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

Правила формирования возвращаемого значения:

  1. Обычное удаление дубликатов:

    • Массив обходится слева направо; сохраняется первое вхождение каждого элемента, а следующие подряд элементы, совпадающие с предыдущим, пропускаются
    • Удаляются только повторяющиеся подряд элементы; дубликаты, расположенные не подряд, сохраняются
    • Значения null сохраняются (null и null считаются одинаковыми)
  2. Поведение в граничных случаях:

    • Если входной массив пуст, возвращается пустой массив
    • Если входной массив равен 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