람다 표현식
람다 표현식 (Lambda expressions)
람다 표현식은 고차(higher-order) SQL 함수에 인자로 전달되는 익명 함수예요.
출처: 문서
본문
람다 표현식은 ->로 작성해요.
x -> x + 1
(x, y) -> x + y
x -> regexp_like(x, 'a+')
x -> x[1] / x[2]
x -> IF(x > 0, x, -x)
x -> COALESCE(x, 0)
x -> CAST(x AS JSON)
x -> x + TRY(1 / 0)
제한 사항 (Limitations)
대부분의 SQL 표현식은 람다 본문에서 쓸 수 있지만, 몇 가지 예외가 있어요.
- 서브쿼리는 지원하지 않아요:
x -> 2 + (SELECT 3) - 집계는 지원하지 않아요:
x -> max(y)
예제 (Examples)
transform()으로 배열 컬럼의 각 요소를 제곱해 볼게요.
SELECT numbers,
transform(numbers, n -> n * n) as squared_numbers
FROM (
VALUES
(ARRAY[1, 2]),
(ARRAY[3, 4]),
(ARRAY[5, 6, 7])
) AS t(numbers);
numbers | squared_numbers
-----------+-----------------
[1, 2] | [1, 4]
[3, 4] | [9, 16]
[5, 6, 7] | [25, 36, 49]
(3 rows)
transform()은 배열 요소를 안전하게 문자열로 캐스팅할 때도 쓸 수 있어요.
SELECT transform(prices, n -> TRY_CAST(n AS VARCHAR) || '$') as price_tags
FROM (
VALUES
(ARRAY[100, 200]),
(ARRAY[30, 4])
) AS t(prices);
price_tags
--------------
[100$, 200$]
[30$, 4$]
(2 rows)
조작하는 배열 컬럼뿐 아니라 다른 컬럼도 람다 표현식 안에서 캡처할 수 있어요. 다음 문장은 transform()으로 일차 함수 f(x) = ax + b 값을 계산하는 예를 보여줘요.
SELECT xvalues,
a,
b,
transform(xvalues, x -> a * x + b) as linear_function_values
FROM (
VALUES
(ARRAY[1, 2], 10, 5),
(ARRAY[3, 4], 4, 2)
) AS t(xvalues, a, b);
xvalues | a | b | linear_function_values
---------+----+---+------------------------
[1, 2] | 10 | 5 | [15, 25]
[3, 4] | 4 | 2 | [14, 18]
(2 rows)
any_match()로 100보다 큰 값을 하나 이상 포함한 배열 요소를 찾을 수도 있어요.
SELECT numbers
FROM (
VALUES
(ARRAY[1,NULL,3]),
(ARRAY[10,20,30]),
(ARRAY[100,200,300])
) AS t(numbers)
WHERE any_match(numbers, n -> COALESCE(n, 0) > 100);
-- [100, 200, 300]
regexp_replace()로 문자열의 첫 단어를 대문자로 만들 수도 있어요.
SELECT regexp_replace('once upon a time ...', '^(\w)(\w*)(\s+.*)$',x -> upper(x[1]) || x[2] || x[3]);
-- Once upon a time ...
람다 표현식은 집계 함수에서도 쓸 수 있어요. 다음 문장은 reduce_agg()을 사용해 컬럼의 모든 요소 합을 계산하는 다소 복잡한 예시예요.
SELECT reduce_agg(value, 0, (a, b) -> a + b, (a, b) -> a + b) sum_values
FROM (
VALUES (1), (2), (3), (4), (5)
) AS t(value);
-- 15