Spec-Zone.ru › DuckDB

Функции лямбда

Функции лямбда позволяют использовать более сложные и гибкие выражения в запросах. DuckDB поддерживает несколько скалярных функций, которые работают со списками LIST и принимают функции лямбда в форме (parameter1, parameter2, ...) -> expression. Если функция лямбда имеет только один параметр, то скобки можно опустить. Параметры могут иметь любые имена. Например, следующие являются допустимыми функциями лямбда:

  • param -> param > 1
  • s -> 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_transform
  • apply
  • list_apply
  • array_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_filter
  • filter

Количество параметров, за исключением индексов: 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_reduce
  • reduce

Количество параметров, за исключением индексов: 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API