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

Лямбда-выражения

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

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

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

Синтаксис

parameter -> expression

Параметры

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

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

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

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

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

Практически все скалярные функции можно использовать в теле лямбда-выражения. Однако есть несколько исключений:

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

Примеры

Простые примеры лямбда-выражений:

-- Не принимает параметров и возвращает 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")

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

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)