Функции лямбда
Функции лямбда позволяют использовать более сложные и гибкие выражения в запросах. DuckDB поддерживает несколько скалярных функций, которые работают со списками LIST и принимают функции лямбда в форме (parameter1, parameter2, ...) -> expression. Если функция лямбда имеет только один параметр, то скобки можно опустить. Параметры могут иметь любые имена. Например, следующие являются допустимыми функциями лямбда:
param -> param > 1s -> contains(concat(s, 'DB'), 'duck')(x, y) -> x + y
Скалярные функции, принимающие функции лямбда
| Имя | Описание |
|---|---|
list_transform(list, lambda) | Возвращает список, являющийся результатом применения функции лямбда к каждому элементу входного списка. |
list_filter(list, lambda) | Создаёт список из тех элементов входного списка, для которых функция лямбда возвращает true. |
list_reduce(list, lambda) | Сводит все элементы входного списка к одному значению, выполняя функцию лямбда на текущем результате и следующем элементе списка. Список должен иметь как минимум один элемент — использование начального значения аккумулятора в настоящее время не поддерживается. |
list_transform(list, lambda)
| Описание | Возвращает список, являющийся результатом применения функции лямбда к каждому элементу входного списка. Для получения дополнительной информации см. Преобразование. |
| Пример | list_transform([4, 5, 6], x -> x + 1) |
| Результат | [5, 6, 7] |
| Псевдонимы |
array_transform, apply, list_apply, array_apply
|
list_filter(list, lambda)
| Описание | Создаёт список из тех элементов входного списка, для которых функция лямбда возвращает true. Для получения дополнительной информации см. Фильтр. |
| Пример | list_filter([4, 5, 6], x -> x > 4) |
| Результат | [5, 6] |
| Псевдонимы |
array_filter, filter
|
list_reduce(list, lambda)
| Описание | Сводит все элементы входного списка к одному значению, выполняя функцию лямбда на текущем результате и следующем элементе списка. Список должен иметь как минимум один элемент — использование начального значения аккумулятора в настоящее время не поддерживается. Для получения дополнительной информации см. Сведение. |
| Пример | list_reduce([4, 5, 6], (x, y) -> x + y) |
| Результат | 15 |
| Псевдонимы |
array_reduce, reduce
|
Вложенность
Все скалярные функции могут быть вложены произвольным образом.
Вложенные функции лямбда для получения всех квадратов чётных элементов списка:
SELECT list_transform(
list_filter([0, 1, 2, 3, 4, 5], x -> x % 2 = 0),
y -> y * y
); [0, 4, 16]
Вложенная функция лямбда для добавления каждого элемента первого списка к сумме элементов второго списка:
SELECT list_transform(
[1, 2, 3],
x -> list_reduce([4, 5, 6], (a, b) -> a + b) + x
); [16, 17, 18]
Ограничение области видимости
Функции лямбда подчиняются правилам области видимости в следующем порядке:
- параметры внутренней функции лямбда
- параметры внешней функции лямбда
- имена столбцов
- параметры макроса
CREATE TABLE tbl (x INTEGER); INSERT INTO tbl VALUES (10); SELECT apply([1, 2], x -> apply([4], x -> x + tbl.x)[1] + x) FROM tbl;
[15, 16]
Индексы в качестве параметров
Все функции лямбда принимают необязательный дополнительный параметр, представляющий индекс текущего элемента. Это всегда последний параметр функции лямбда и он основан на 1 (т.е. первый элемент имеет индекс 1).
Получение всех элементов, которые больше их индекса:
SELECT list_filter([1, 3, 1, 5], (x, i) -> x > i);
[3, 5]
Преобразование
Подпись: list_transform(list, lambda)
Описание: list_transform возвращает список, являющийся результатом применения функции лямбда к каждому элементу входного списка.
Псевдонимы:
array_transformapplylist_applyarray_apply
Количество параметров, за исключением индексов: 1
Тип возвращаемого значения: Определяется типом возвращаемого значения функцией лямбда
Примеры
Увеличение каждого элемента списка на единицу:
SELECT list_transform([1, 2, NULL, 3], x -> x + 1);
[2, 3, NULL, 4]
Преобразование строк:
SELECT list_transform(['Duck', 'Goose', 'Sparrow'], s -> concat(s, 'DB'));
[DuckDB, GooseDB, SparrowDB]
Комбинирование лямбда-функций с другими функциями:
SELECT list_transform([5, NULL, 6], x -> coalesce(x, 0) + 1);
[6, 1, 7]
Фильтр
Подпись: list_filter(list, lambda)
Описание: Создает список из тех элементов входного списка, для которых лямбда-функция возвращает true. DuckDB должен иметь возможность привести тип возвращаемого значения лямбда-функции к BOOL.
Псевдонимы:
array_filterfilter
Количество параметров, за исключением индексов: 1
Тип возвращаемого значения: Тип, совпадающий с типом входного списка
Примеры
Фильтрация отрицательных значений:
SELECT list_filter([5, -6, NULL, 7], x -> x > 0);
[5, 7]
Делимость на 2 и 5:
SELECT list_filter(
list_filter([2, 4, 3, 1, 20, 10, 3, 30], x -> x % 2 = 0),
y -> y % 5 = 0
); [20, 10, 30]
В сочетании с range(...) для построения списков:
SELECT list_filter([1, 2, 3, 4], x -> x > #1) FROM range(4);
[1, 2, 3, 4] [2, 3, 4] [3, 4] [4] []
Сведение
Подпись: list_reduce(list, lambda)
Описание: Скалярная функция возвращает единственное значение, являющееся результатом применения лямбда-функции к каждому элементу входного списка. Начиная с первого элемента, затем повторно применяя лямбда-функцию к результату предыдущего применения и следующему элементу списка. Список должен содержать по крайней мере один элемент.
Псевдонимы:
array_reducereduce
Количество параметров, за исключением индексов: 2
Тип возвращаемого значения: Тип элементов входного списка
Примеры
Сумма всех элементов списка:
SELECT list_reduce([1, 2, 3, 4], (x, y) -> x + y);
10
Суммирование элементов списка, если они больше 2:
SELECT list_reduce(list_filter([1, 2, 3, 4], x -> x > 2), (x, y) -> x + y);
7
Конкатенация всех элементов списка:
SELECT list_reduce(['DuckDB', 'is', 'awesome'], (x, y) -> concat(x, ' ', y));
DuckDB is awesome
© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/sql/functions/lambda.html