Лямбда-выражения
Лямбда-выражения — это анонимные функции, которые м ожно передавать в качестве параметров в функции высшего порядка 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)