8.6 KiB
Функции высшего порядка
Оператор ->
, функция lambda(params, expr)
Позволяет описать лямбда-функцию для передачи в функцию высшего порядка. Слева от стрелочки стоит формальный параметр - произвольный идентификатор, или несколько формальных параметров - произвольные идентификаторы в кортеже. Справа от стрелочки стоит выражение, в котором могут использоваться эти формальные параметры, а также любые столбцы таблицы.
Примеры: x -> 2 * x, str -> str != Referer.
Функции высшего порядка, в качестве своего функционального аргумента могут принимать только лямбда-функции.
В функции высшего порядка может быть передана лямбда-функция, принимающая несколько аргументов. В этом случае, в функцию высшего порядка передаётся несколько массивов одинаковых длин, которым эти аргументы будут соответствовать.
Для некоторых функций, например arrayCount или arraySum, первый аргумент (лямбда-функция) может отсутствовать. В этом случае, подразумевается тождественное отображение.
Для функций, перечисленных ниже, лямбда-функцию должна быть указана всегда:
arrayMap(func, arr1, …)
Вернуть массив, полученный на основе результатов применения функции func
к каждому элементу массива arr
.
Примеры:
SELECT arrayMap(x -> (x + 2), [1, 2, 3]) as res;
┌─res─────┐
│ [3,4,5] │
└─────────┘
Следующий пример показывает, как создать кортежи из элементов разных массивов:
SELECT arrayMap((x, y) -> (x, y), [1, 2, 3], [4, 5, 6]) AS res
┌─res─────────────────┐
│ [(1,4),(2,5),(3,6)] │
└─────────────────────┘
Обратите внимание, что у функции arrayMap
первый аргумент (лямбда-функция) не может быть опущен.
arrayFilter(func, arr1, …)
Вернуть массив, содержащий только те элементы массива arr1
, для которых функция func
возвращает не 0.
Примеры:
SELECT arrayFilter(x -> x LIKE '%World%', ['Hello', 'abc World']) AS res
┌─res───────────┐
│ ['abc World'] │
└───────────────┘
SELECT
arrayFilter(
(i, x) -> x LIKE '%World%',
arrayEnumerate(arr),
['Hello', 'abc World'] AS arr)
AS res
┌─res─┐
│ [2] │
└─────┘
Обратите внимание, что у функции arrayFilter
первый аргумент (лямбда-функция) не может быть опущен.
arrayCount([func,] arr1, …)
Вернуть количество элементов массива arr
, для которых функция func возвращает не 0. Если func не указана - вернуть количество ненулевых элементов массива.
arrayExists([func,] arr1, …)
Вернуть 1, если существует хотя бы один элемент массива arr
, для которого функция func возвращает не 0. Иначе вернуть 0.
arrayAll([func,] arr1, …)
Вернуть 1, если для всех элементов массива arr
, функция func
возвращает не 0. Иначе вернуть 0.
arraySum([func,] arr1, …)
Вернуть сумму значений функции func
. Если функция не указана - просто вернуть сумму элементов массива.
arrayFirst(func, arr1, …)
Вернуть первый элемент массива arr1
, для которого функция func возвращает не 0.
Обратите внимание, что у функции arrayFirst
первый аргумент (лямбда-функция) не может быть опущен.
arrayFirstIndex(func, arr1, …)
Вернуть индекс первого элемента массива arr1
, для которого функция func возвращает не 0.
Обратите внимание, что у функции arrayFirstFilter
первый аргумент (лямбда-функция) не может быть опущен.
arrayCumSum([func,] arr1, …)
Возвращает массив из частичных сумм элементов исходного массива (сумма с накоплением). Если указана функция func
, то значения элементов массива преобразуются этой функцией перед суммированием.
Пример:
SELECT arrayCumSum([1, 1, 1, 1]) AS res
┌─res──────────┐
│ [1, 2, 3, 4] │
└──────────────┘
arraySort([func,] arr1, …)
Возвращает отсортированный в восходящем порядке массив arr1
. Если задана функция func
, то порядок сортировки определяется результатом применения функции func
на элементы массива (массивов).
Для улучшения эффективности сортировки применяется Преобразование Шварца.
Пример:
SELECT arraySort((x, y) -> y, ['hello', 'world'], [2, 1]);
┌─res────────────────┐
│ ['world', 'hello'] │
└────────────────────┘
Подробная информация о методе arraySort
приведена в разделе Функции по работе с массивами.
arrayReverseSort([func,] arr1, …)
Возвращает отсортированный в нисходящем порядке массив arr1
. Если задана функция func
, то порядок сортировки определяется результатом применения функции func
на элементы массива (массивов).
Пример:
SELECT arrayReverseSort((x, y) -> y, ['hello', 'world'], [2, 1]) as res;
┌─res───────────────┐
│ ['hello','world'] │
└───────────────────┘
Подробная информация о методе arrayReverseSort
приведена в разделе Функции по работе с массивами.