Работа с массивами#
Данный документ описывает операторы и функции для работы с типом данных ARRAY.
Создание массива целых чисел:
SELECT ARRAY[1, 2, 4];
-- [1, 2, 4]
Создание массива строковых значений:
SELECT ARRAY['foo', 'bar', 'bazz'];
-- [foo, bar, bazz]
Элементы массива должны иметь одинаковый тип, либо должна существовать возможность приведения значений к общему типу. В следующем примере используются целочисленные и десятичные значения, и результирующий массив содержит десятичные числа:
SELECT ARRAY[1, 1.2, 4];
-- [1.0, 1.2, 4.0]
Значения NULL допустимы:
SELECT ARRAY[1, 2, NULL, -4, NULL];
-- [1, 2, NULL, -4, NULL]
Оператор доступа по индексу: []#
Оператор [] используется для доступа к элементу массива. Индексация начинается с единицы:
SELECT my_array[1] AS first_element
В следующем примере создается массив, а затем извлекается второй элемент:
SELECT ARRAY[1, 1.2, 4][2];
-- 1.2
Оператор конкатенации: ||#
Оператор || используется для конкатенации массива с другим массивом или с элементом того же типа:
SELECT ARRAY[1] || ARRAY[2];
-- [1, 2]
SELECT ARRAY[1] || 2;
-- [1, 2]
SELECT 2 || ARRAY[1];
-- [2, 1]
Функции массивов#
- all_match(array(T), function(T, boolean)) boolean#
Возвращает
true, если все элементы массива соответствуют заданному предикату (частный случай — когда массив пуст);false, если один или более элементов не соответствуют;NULL, если функция-предикат возвращаетNULLдля одного или более элементов, а для всех остальных —true.
- any_match(array(T), function(T, boolean)) boolean#
Возвращает
true, если хотя бы один элемент массива соответствует заданному предикату;false, если ни один элемент не соответствует (частный случай — когда массив пуст);NULL, если функция-предикат возвращаетNULLдля одного или более элементов, а для всех остальных —false.
- array_cum_sum(x) array#
Returns an array of the partial (running) sums of the elements in the source BIGINT array.
- array_distinct(x) array#
Удаляет повторяющиеся значения из массива
x.
- array_intersect(x, y) array#
Возвращает массив элементов, входящих в пересечение
xиy, без дубликатов.
- array_union(x, y) array#
Возвращает массив элементов, входящих в объединение
xиy, без дубликатов.
- array_except(x, y) array#
Возвращает массив элементов, которые присутствуют в
x, но отсутствуют вy, без дубликатов.
- array_histogram(x) map<K, bigint>#
Возвращает словарь (map), в котором ключами являются уникальные элементы входного массива
x, а значениями — количество вхождений каждого элемента вx. ЗначенияNULLигнорируются.SELECT array_histogram(ARRAY[42, 7, 42, NULL]); -- {42=2, 7=1}
Возвращает пустой словарь, если во входном массиве нет ненулевых элементов.
SELECT array_histogram(ARRAY[NULL, NULL]); -- {}
- array_join(x, delimiter) varchar#
Объединяет элементы заданного массива с использованием разделителя. Элементы со значением
NULLпропускаются.
- array_join(x, delimiter, null_replacement) varchar
Объединяет элементы заданного массива с использованием разделителя и необязательной строки для замены значений
NULL.
- array_max(x) x#
Возвращает максимальное значение из входного массива.
- array_min(x) x#
Возвращает минимальное значение из входного массива.
- array_position(x, element) bigint#
Возвращает позицию первого вхождения элемента
elementв массивеx(или 0, если элемент не найден).
- array_remove(x, element) array#
Удаляет из массива
xвсе элементы, равныеelement.
- array_sort(x) array#
Сортирует и возвращает массив
x. Элементыxдолжны поддерживать сравнение. Элементы со значениемNULLпомещаются в конец возвращаемого массива.
- array_sort(array(T), function(T, T, int)) -> array(T)
Сортирует и возвращает массив на основе заданной функции-компаратора. Компаратор принимает два аргумента, допускающих
NULL, которые представляют два элемента массива. Он возвращает -1, 0 или 1 в зависимости от того, является ли первый элемент меньше, равен или больше второго элемента. Если функция-компаратор возвращает другие значения (включаяNULL), запрос завершится с ошибкой.SELECT array_sort(ARRAY[3, 2, 5, 1, 2], (x, y) -> IF(x < y, 1, IF(x = y, 0, -1))); -- [5, 3, 2, 2, 1] SELECT array_sort(ARRAY['bc', 'ab', 'dc'], (x, y) -> IF(x < y, 1, IF(x = y, 0, -1))); -- ['dc', 'bc', 'ab'] SELECT array_sort(ARRAY[3, 2, null, 5, null, 1, 2], -- sort null first with descending order (x, y) -> CASE WHEN x IS NULL THEN -1 WHEN y IS NULL THEN 1 WHEN x < y THEN 1 WHEN x = y THEN 0 ELSE -1 END); -- [null, null, 5, 3, 2, 2, 1] SELECT array_sort(ARRAY[3, 2, null, 5, null, 1, 2], -- sort null last with descending order (x, y) -> CASE WHEN x IS NULL THEN 1 WHEN y IS NULL THEN -1 WHEN x < y THEN 1 WHEN x = y THEN 0 ELSE -1 END); -- [5, 3, 2, 2, 1, null, null] SELECT array_sort(ARRAY['a', 'abcd', 'abc'], -- sort by string length (x, y) -> IF(length(x) < length(y), -1, IF(length(x) = length(y), 0, 1))); -- ['a', 'abc', 'abcd'] SELECT array_sort(ARRAY[ARRAY[2, 3, 1], ARRAY[4, 2, 1, 4], ARRAY[1, 2]], -- sort by array length (x, y) -> IF(cardinality(x) < cardinality(y), -1, IF(cardinality(x) = cardinality(y), 0, 1))); -- [[1, 2], [2, 3, 1], [4, 2, 1, 4]]
- arrays_overlap(x, y) boolean#
Проверяет, имеют ли массивы
xиyобщие ненулевые элементы. ВозвращаетNULL, если общих ненулевых элементов нет, но хотя бы один из массивов содержитNULL.
- cardinality(x) bigint#
Возвращает мощность (размер) массива
x.
- concat(array1, array2, ..., arrayN) array
Объединяет массивы
array1,array2,...,arrayN. Эта функция предоставляет ту же функциональность, что и стандартный оператор конкатенации SQL (||).
- combinations(array(T), n) -> array(array(T))#
Возвращает подгруппы из
nэлементов входного массива. Если входной массив не содержит дубликатов,combinationsвозвращает подмножества изnэлементов.SELECT combinations(ARRAY['foo', 'bar', 'baz'], 2); -- [['foo', 'bar'], ['foo', 'baz'], ['bar', 'baz']] SELECT combinations(ARRAY[1, 2, 3], 2); -- [[1, 2], [1, 3], [2, 3]] SELECT combinations(ARRAY[1, 2, 2], 2); -- [[1, 2], [1, 2], [2, 2]]
Порядок подгрупп детерминирован, но не определен. Порядок элементов внутри подгруппы детерминирован, но не определен. Значение
nне должно превышать 5, а общий размер сгенерированных подгрупп должен быть менее 100 000.
- contains(x, element) boolean#
Возвращает
true, если массивxсодержит элементelement.
- contains_sequence(x, seq) boolean#
Возвращает
true, если массивxсодержит все элементы массиваseqв виде подпоследовательности (все значения в том же порядке следования).
- element_at(array(E), index) E#
Возвращает элемент массива по заданному индексу
index. Еслиindex> 0, функция предоставляет ту же функциональность, что и стандартный оператор индексации SQL ([]), за исключением того, что функция возвращаетNULLпри обращении по индексу, превышающему длину массива, тогда как оператор индексации в этом случае вызовет ошибку. Еслиindex< 0,element_atобращается к элементам с конца массива к началу.
- filter(array(T), function(T, boolean)) -> array(T)#
Создает массив из тех элементов исходного массива, для которых функция возвращает
true:SELECT filter(ARRAY[], x -> true); -- [] SELECT filter(ARRAY[5, -6, NULL, 7], x -> x > 0); -- [5, 7] SELECT filter(ARRAY[5, NULL, 7, NULL], x -> x IS NOT NULL); -- [5, 7]
- flatten(x) array#
Преобразует
array(array(T))вarray(T)путем конкатенации вложенных массивов.
- ngrams(array(T), n) -> array(array(T))#
Возвращает N-граммы (подпоследовательности из
nсмежных элементов) для массива. Порядок N-грамм в результате не определен.SELECT ngrams(ARRAY['foo', 'bar', 'baz', 'foo'], 2); -- [['foo', 'bar'], ['bar', 'baz'], ['baz', 'foo']] SELECT ngrams(ARRAY['foo', 'bar', 'baz', 'foo'], 3); -- [['foo', 'bar', 'baz'], ['bar', 'baz', 'foo']] SELECT ngrams(ARRAY['foo', 'bar', 'baz', 'foo'], 4); -- [['foo', 'bar', 'baz', 'foo']] SELECT ngrams(ARRAY['foo', 'bar', 'baz', 'foo'], 5); -- [['foo', 'bar', 'baz', 'foo']] SELECT ngrams(ARRAY[1, 2, 3, 4], 2); -- [[1, 2], [2, 3], [3, 4]]
- none_match(array(T), function(T, boolean)) boolean#
Возвращает
true, если ни один элемент массива не соответствует заданному предикату (частный случай — когда массив пуст);false, если один или более элементов соответствуют;NULL, если функция-предикат возвращаетNULLдля одного или более элементов, а для всех остальных —false.
- reduce(array(T), initialState S, inputFunction(S, T, S), outputFunction(S, R)) R#
Возвращает единственное значение, полученное в результате свертки массива. Функция
inputFunctionвызывается для каждого элемента массива по порядку. Помимо элемента,inputFunctionпринимает текущее состояние (начальное значение —initialState) и возвращает новое состояние. ФункцияoutputFunctionвызывается для преобразования финального состояния в результирующее значение. Она может быть тождественной функцией (i -> i).SELECT reduce(ARRAY[], 0, (s, x) -> s + x, s -> s); -- 0 SELECT reduce(ARRAY[5, 20, 50], 0, (s, x) -> s + x, s -> s); -- 75 SELECT reduce(ARRAY[5, 20, NULL, 50], 0, (s, x) -> s + x, s -> s); -- NULL SELECT reduce(ARRAY[5, 20, NULL, 50], 0, (s, x) -> s + coalesce(x, 0), s -> s); -- 75 SELECT reduce(ARRAY[5, 20, NULL, 50], 0, (s, x) -> IF(x IS NULL, s, s + x), s -> s); -- 75 SELECT reduce(ARRAY[2147483647, 1], BIGINT '0', (s, x) -> s + x, s -> s); -- 2147483648 -- calculates arithmetic average SELECT reduce(ARRAY[5, 6, 10, 20], CAST(ROW(0.0, 0) AS ROW(sum DOUBLE, count INTEGER)), (s, x) -> CAST(ROW(x + s.sum, s.count + 1) AS ROW(sum DOUBLE, count INTEGER)), s -> IF(s.count = 0, NULL, s.sum / s.count)); -- 10.25
- repeat(element, count) array#
Повторяет элемент
elementуказанное количество разcount.
- reverse(x) array
Возвращает массив с обратным порядком элементов массива
x.
- sequence(start, stop)#
Генерирует последовательность целых чисел от
startдоstopс шагом1, еслиstartменьше или равенstop, иначе с шагом-1.
- sequence(start, stop, step)
Генерирует последовательность целых чисел от
startдоstopс шагомstep.
- sequence(start, stop)
Генерирует последовательность дат от даты
startдо датыstopс шагом1день, если датаstartменьше или равна датеstop, иначе с шагом-1день.
- sequence(start, stop, step)
Генерирует последовательность дат от
startдоstopс шагомstep. Типstepможет бытьINTERVAL DAY TO SECONDилиINTERVAL YEAR TO MONTH.
- sequence(start, stop, step)
Генерирует последовательность временных меток от
startдоstopс шагомstep. Типstepможет бытьINTERVAL DAY TO SECONDилиINTERVAL YEAR TO MONTH.
- shuffle(x) array#
Генерирует случайную перестановку элементов заданного массива
x.
- slice(x, start, length) array#
Возвращает часть массива
x, начиная с индексаstart(или с конца, еслиstartотрицательный) длинойlength.
- trim_array(x, n) array#
Удаляет
nэлементов с конца массива:SELECT trim_array(ARRAY[1, 2, 3, 4], 1); -- [1, 2, 3] SELECT trim_array(ARRAY[1, 2, 3, 4], 2); -- [1, 2]
- transform(array(T), function(T, U)) -> array(U)#
Возвращает массив, полученный в результате применения функции
functionк каждому элементу массива:SELECT transform(ARRAY[], x -> x + 1); -- [] SELECT transform(ARRAY[5, 6], x -> x + 1); -- [6, 7] SELECT transform(ARRAY[5, NULL, 6], x -> coalesce(x, 0) + 1); -- [6, 1, 7] SELECT transform(ARRAY['x', 'abc', 'z'], x -> x || '0'); -- ['x0', 'abc0', 'z0'] SELECT transform(ARRAY[ARRAY[1, NULL, 2], ARRAY[3, NULL]], a -> filter(a, x -> x IS NOT NULL)); -- [[1, 2], [3]]
- euclidean_distance(array(double), array(double)) double#
Вычисляет евклидово расстояние:
SELECT euclidean_distance(ARRAY[1.0, 2.0], ARRAY[3.0, 4.0]); -- 2.8284271247461903
- dot_product(array(double), array(double)) double#
Вычисляет скалярное произведение:
SELECT dot_product(ARRAY[1.0, 2.0], ARRAY[3.0, 4.0]); -- 11.0
- zip(array1, array2[, ...]) -> array(row)#
Объединяет заданные массивы поэлементно в единый массив строк (rows). M-й элемент N-го аргумента станет N-м полем M-го выходного элемента. Если аргументы имеют разную длину, недостающие значения заполняются значением
NULL.SELECT zip(ARRAY[1, 2], ARRAY['1b', null, '3b']); -- [ROW(1, '1b'), ROW(2, null), ROW(null, '3b')]
- zip_with(array(T), array(U), function(T, U, R)) -> array(R)#
Объединяет два заданных массива поэлементно в единый массив с помощью функции
function. Если один массив короче, в его конец добавляются значенияNULLдля выравнивания длины с более длинным массивом перед применением функции.SELECT zip_with(ARRAY[1, 3, 5], ARRAY['a', 'b', 'c'], (x, y) -> (y, x)); -- [ROW('a', 1), ROW('b', 3), ROW('c', 5)] SELECT zip_with(ARRAY[1, 2], ARRAY[3, 4], (x, y) -> x + y); -- [4, 6] SELECT zip_with(ARRAY['a', 'b', 'c'], ARRAY['d', 'e', 'f'], (x, y) -> concat(x, y)); -- ['ad', 'be', 'cf'] SELECT zip_with(ARRAY['a'], ARRAY['d', null, 'f'], (x, y) -> coalesce(x, y)); -- ['a', null, 'f']