Перейти к основному содержимому

Lambda выражения

Lambda выражения — это анонимные функции, которые могут передаваться в качестве параметров в функции SQL высшего порядка. Lambda выражения позволяют разрабатывать более лаконичный, элегантный и расширяемый код.

Lambda выражения записываются с помощью оператора ->, который читается как "переходит к". Левая сторона -> содержит входные параметры (если есть), а правая сторона — выражение.

Начиная с версии 1.5.0, Selena поддерживает использование lambda выражений в следующих функциях SQL высшего порядка: array_map(), array_filter(), array_sum() и array_sortby().

Синтаксис

parameter -> expression

Параметры

  • parameter: входные параметры для lambda выражения, которые могут принимать ноль, один или несколько параметров. Два или более входных параметра заключаются в круглые скобки.

  • expression: простое выражение, которое ссылается на parameter. Выражение должно быть валидным для входных параметров.

Возвращаемое значение

Тип возвращаемого значения определяется типом результата expression.

Примечания по использованию

Почти все скалярные функции могут использоваться в теле lambda. Но есть несколько исключений:

  • Подзапросы не поддерживаются, например, x -> 5 + (SELECT 3).
  • Агрегатные функции не поддерживаются, например, x -> min(y).
  • Оконные функции не поддерживаются.
  • Табличные функции не поддерживаются.
  • Коррелированные столбцы не могут встречаться в lambda функциях.

Примеры

Простые примеры lambda выражений:

-- Не принимает параметров и возвращает 5.
() -> 5
-- Принимает x и возвращает значение (x + 2).
x -> x + 2
-- Принимает x и y, и возвращает их сумму.
(x, y) -> x + y
-- Принимает x и применяет функцию к x.
x -> COALESCE(x, 0)
x -> day(x)
x -> split(x,",")
x -> if(x>0,"positive","negative")

Пример использования lambda выражений в функциях высшего порядка:

select array_map((x,y,z) -> x + y, [1], [2], [4]);
+----------------------------------------------+
| array_map((x, y, z) -> x + y, [1], [2], [4]) |
+----------------------------------------------+
| [3] |
+----------------------------------------------+
1 row in set (0.01 sec)