Перейти к основному содержимому
Версия: 1.5.x

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)