Функции и операторы массивов#
Функции и операторы массивов используют тип 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_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_first(array(E)) E#
Возвращает первый элемент
array. Если массив пуст, функция возвращаетNULL, тогда как оператор индексации в таком случае завершится ошибкой.
- array_first(array(E), function(E, boolean)) E
Возвращает первый элемент
array, который соответствует предикату. Если массив пуст или совпадений нет, функция возвращаетNULL.
- array_histogram(x) map<K, bigint>#
Возвращает map, где ключами являются уникальные элементы входного массива
x, а значениями - количество появлений каждого элемента вx. Значения null игнорируются.SELECT array_histogram(ARRAY[42, 7, 42, NULL]); -- {42=2, 7=1}
Возвращает пустой map, если во входном массиве нет ненулевых элементов.
SELECT array_histogram(ARRAY[NULL, NULL]); -- {}
- array_join(x, delimiter) varchar#
Конкатенирует элементы заданного массива с использованием разделителя. Элементы null в результате пропускаются.
- array_join(x, delimiter, null_replacement) varchar
Конкатенирует элементы заданного массива с использованием разделителя и необязательной строки для замены null.
- array_last(array(E)) E#
Возвращает последний элемент
array. Если массив пуст, функция возвращает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)
Сортирует и возвращает
arrayна основе заданной функции сравненияfunction. Функция сравнения принимает два nullable-аргумента, представляющих два nullable-элементаarray. Она возвращает -1, 0 или 1, если первый nullable элемент меньше, равен или больше второго nullable элемента. Если функция сравнения возвращает другие значения (включая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#
Возвращает элемент
arrayпо заданномуindex. Еслиindex> 0, эта функция предоставляет ту же функциональность, что и стандартный SQL оператор индексации ([]), за исключением того, что функция возвращаетNULLпри обращении кindex, превышающему длину массива, тогда как оператор индексации в таком случае завершится ошибкой. Еслиindex< 0,element_atобращается к элементам от последнего к первому.
- filter(array(T), function(T, boolean)) -> array(T)#
Формирует массив из тех элементов
array, для которыхfunctionвозвращает 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элементов) дляarray. Порядок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#
Возвращает одно значение, свернутое из
array.inputFunctionбудет вызвана для каждого элемента вarrayпо порядку. Помимо самого элемента,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#
Повторяет
elementcountраз.
- 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)
Генерирует последовательность timestamp от
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к каждому элементуarray: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)#
Объединяет заданные массивы поэлементно в один массив строк. 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 до длины более длинного массива перед применениемfunction.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']