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

ARRAY_DISTINCT

array_distinct​

SinceVersion 2.0.0

Описание​

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

Синтаксис​

array_distinct(ARRAY<T> arr)

Параметры​

  • arr:тип ARRAY<T>, массив, из которого нужно удалить дубликаты. Поддерживаются имена столбцов или константные значения.

Поддерживаемые типы 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<T>

Возвращаемое значение:

  • Массив без дубликатов, содержащий все уникальные элементы исходного массива
  • Сохраняется исходный порядок элементов
  • NULL: если входной массив равен NULL

Примечания по использованию:

  • Функция обходит массив слева направо, сохраняя первое вхождение каждого элемента и удаляя последующие повторения
  • Для пустого массива возвращается пустой массив, для массива NULL возвращается NULL
  • При удалении дубликатов сохраняется относительный порядок элементов исходного массива, элементы не переставляются
  • Значения null среди элементов массива: повторяющиеся элементы null также удаляются, из нескольких значений null сохраняется только одно

Примеры​

Примеры запросов:

Удаление дубликатов из массива целых чисел: исходный массив [1, 2, 3, 4, 5] не содержит повторяющихся элементов, поэтому результат удаления дубликатов совпадает с исходным массивом.

SELECT array_distinct([1, 2, 3, 4, 5]);
+---------------------------------+
| array_distinct([1, 2, 3, 4, 5]) |
+---------------------------------+
| [1, 2, 3, 4, 5] |
+---------------------------------+

Удаление дубликатов из массива строк: удаляются повторяющиеся строковые элементы. В исходном массиве ['a', 'b', 'a', 'c', 'b', 'd'] элемент 'a' встречается дважды (сохраняется первое вхождение), элемент 'b' встречается дважды (сохраняется первое вхождение); после удаления дубликатов получается ["a", "b", "c", "d"].

SELECT array_distinct(['a', 'b', 'a', 'c', 'b', 'd']);
+------------------------------------------------+
| array_distinct(['a', 'b', 'a', 'c', 'b', 'd']) |
+------------------------------------------------+
| ["a", "b", "c", "d"] |
+------------------------------------------------+

Массив со значениями null: повторяющиеся элементы null также удаляются, из нескольких значений null сохраняется только одно. В исходном массиве [1, null, 2, null, 3, null] значение null встречается три раза; после удаления дубликатов сохраняется только первое значение null, и получается [1, null, 2, 3].

SELECT array_distinct([1, null, 2, null, 3, null]);
+---------------------------------------------+
| array_distinct([1, null, 2, null, 3, null]) |
+---------------------------------------------+
| [1, null, 2, 3] |
+---------------------------------------------+

Удаление дубликатов из массива типа IP: удаление дубликатов из массива IPv4-адресов. В исходном массиве ['192.168.1.1', '192.168.1.2', '192.168.1.1'] адрес '192.168.1.1' встречается дважды; после удаления дубликатов сохраняется только первое вхождение адреса, и получается [192.168.1.1, 192.168.1.2].

SELECT array_distinct(CAST(['192.168.1.1', '192.168.1.2', '192.168.1.1'] AS ARRAY<IPV4>));
+------------------------------------------------------------------------------------+
| array_distinct(CAST(['192.168.1.1', '192.168.1.2', '192.168.1.1'] AS ARRAY<IPV4>)) |
+------------------------------------------------------------------------------------+
| ["192.168.1.1", "192.168.1.2"] |
+------------------------------------------------------------------------------------+

Удаление дубликатов из массива типа IPv6: удаление дубликатов из массива IPv6-адресов. В исходном массиве ['2001:db8::1', '2001:db8::2', '2001:db8::1'] адрес '2001:db8::1' встречается дважды; после удаления дубликатов сохраняется только первое вхождение адреса, и получается [2001:db8::1, 2001:db8::2].

SELECT array_distinct(CAST(['2001:db8::1', '2001:db8::2', '2001:db8::1'] AS ARRAY<IPV6>));
+------------------------------------------------------------------------------------+
| array_distinct(CAST(['2001:db8::1', '2001:db8::2', '2001:db8::1'] AS ARRAY<IPV6>)) |
+------------------------------------------------------------------------------------+
| ["2001:db8::1", "2001:db8::2"] |
+------------------------------------------------------------------------------------+

Для пустого массива возвращается пустой массив: пустой массив не содержит элементов, которые нужно проверять на дубликаты, поэтому сразу возвращается пустой массив.

SELECT array_distinct([]);
+--------------------+
| array_distinct([]) |
+--------------------+
| [] |
+--------------------+

Если массив равен NULL, возвращается NULL: при входном массиве NULL функция возвращает NULL без ошибки.

SELECT array_distinct(NULL);
+----------------------+
| array_distinct(NULL) |
+----------------------+
| NULL |
+----------------------+

Для массива с одним элементом возвращается исходный массив: массив с единственным элементом не содержит дубликатов, поэтому результат удаления дубликатов совпадает с исходным массивом.

SELECT array_distinct([42]);
+----------------------+
| array_distinct([42]) |
+----------------------+
| [42] |
+----------------------+

Сложные типы не поддерживаются:

Вложенные массивы не поддерживаются, возникает ошибка.

SELECT array_distinct([[1,2,3], [4,5,6], [1,2,3]]);
ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.6)[RUNTIME_ERROR]execute failed or unsupported types for function array_distinct(Array(Nullable(Array(Nullable(TINYINT)))))

Тип Map не поддерживается, возникает ошибка.

SELECT array_distinct([{'a':1}, {'b':2}, {'a':1}]);
ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.6)[RUNTIME_ERROR]execute failed or unsupported types for function array_distinct(Array(Nullable(Map(Nullable(String), Nullable(TINYINT)))))

Тип Struct не поддерживается, возникает ошибка.

SELECT array_distinct(array(named_struct('name','Alice','age',20), named_struct('name','Bob','age',30), named_struct('name','Alice','age',20)));
ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.6)[RUNTIME_ERROR]execute failed or unsupported types for function array_distinct(Array(Nullable(Struct(name:Nullable(String), age:Nullable(TINYINT)))))

Неверное количество параметров вызывает ошибку: функция array_distinct принимает только один параметр типа массива, поэтому передача нескольких параметров приводит к ошибке.

SELECT array_distinct([1, 2, 3], [4, 5, 6]);
ERROR 1105 (HY000): errCode = 2, detailMessage = Can not found function 'array_distinct' which has 2 arity. Candidate functions are: [array_distinct(Expression)]

Передача значения, не являющегося массивом, вызывает ошибку: функция array_distinct принимает только параметры типа массива, поэтому передача значений других типов, например строк, приводит к ошибке.

SELECT array_distinct('not_an_array');
ERROR 1105 (HY000): errCode = 2, detailMessage = Can not find the compatibility function signature: array_distinct(VARCHAR(12))

Ключевые слова​

ARRAY, DISTINCT, ARRAY_DISTINCT