ARRAY_DISTINCT
array_distinct
Описание
Удаляет повторяющиеся элементы из массива и возвращает новый массив, содержащий уникальные элементы. Функция сохраняет исходный порядок элементов, оставляя только первое вхождение каждого элемента.
Синтаксис
array_distinct(ARRAY<T> arr)
Параметры
arr:тип ARRAY<T>, массив, из которого нужно удалить дубликаты. Поддерживаются имена столбцов и константные значения.
Поддерживаемые типы T:
- Числовые типы: TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL
- Строковые типы: CHAR, VARCHAR, STRING
- Типы даты и времени: DATE, DATETIME, DATEV2, DATETIMEV2
- Логический тип: BOOLEAN
- Типы IP: IPV4, IPV6
Возвращаемое значение
Тип возвращаемого значения: ARRAY<T>
Описание возвращаемого значения:
- Массив без дубликатов, содержащий все уникальные элементы исходного массива
- Сохраняется исходный порядок элементов
- 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