When SQL Meets Lambda Expressions

0
252

A few modern SQL dialects have started introducing lambda expressions

ARRAY types are a part of the ISO/IEC 9075 SQL standard. The standard specifies how to:

  • Construct arrays
  • Nest data into arrays (e.g. by means of aggregation or subqueries)
  • Unnest data from arrays into tables

But it is very unopinionated when it comes to function support. The ISO/IEC 9075-2:2023(E) 6.47 <array value expression> specifies concatenation of arrays, whereas the 6.48 <array value function> section lists a not extremely useful TRIM_ARRAY function, exclusively (using which you can remove the last N elements of an array, something I have yet to encounter a use-case for)

The implementations fare better. Many of them have a ton of useful functions, and since recently , there are a couple of more modern SQL dialects out there who have started experimenting with lambda expressions in SQL, when working with ARRAY types. These dialects include, mostly:

  • ClickHouse
  • Databricks
  • DuckDB
  • Snowflake
  • Trino

Take the ARRAY_FILTER function, for example. With jOOQ you might write something like this, where you apply a filter that keeps only even numbers in an array:

arrayFilter(array(1, 2, 2, 3), e -> e.mod(2).eq(0))

The corresponding jOOQ API is simply:

public static <T> Field<T[]> arrayFilter(
    Field<T[]> array, 
    Function1<? super Field<T>, ? extends Condition> predicate
) { ... }

So, jOOQ can simply map Java (or Kotlin, Scala) lambda expressions to a SQL lambda expression, without any magic. You just construct an expression of the right type, as always with jOOQ.

The result of such an expression might look like this:

+--------------+
| array_filter |
+--------------+
| [ 2, 2 ]     |
+--------------+

In DuckDB, for example, the above is translated to:

array_filter(
  ARRAY[1, 2, 2, 3],
  e -> (e % 2) = 0
)

If the dialect doesn’t support the lambda style syntax, the function can easily be emulated using a subquery that unnests the array, applies a WHERE clause corresponding to the lambda, and collects the results back into an array, e.g. in PostgreSQL:

(
  SELECT coalesce(
    array_agg(e),
    CAST(ARRAY[] AS int[])
  )
  FROM UNNEST(ARRAY[1, 2, 2, 3]) t (e)
  WHERE mod(e, 2) = 0
)

This works just the same way when the array isn’t just a static array literal, but an array expression, e.g. TABLE.ARRAY_FIELD.

Related functions include:

إعلان مُمول
إعلان مُمول
إعلان مُمول
البحث
Virtualbook
CDN FREE
الأقسام
إقرأ المزيد
أخرى
Nakon što su ih oteli i priveli iz voda uz obalu Egipta, Greta Thunberg i aktivisti će biti deportirani iz Izraela
Nakon što su ih oteli i priveli iz voda uz obalu Egipta, Greta Thunberg i aktivisti će biti...
بواسطة Martina Lukačić 2025-06-10 07:56:08 0 216
Art
Uncanny Valley: Verpassen Sie nicht das erste Live-Event in San Francisco!
Uncanny Valley, WIRED, Live-Show, Tickets, San Francisco, Technologie, Kunst, Innovation, Kultur,...
بواسطة Mia Luisa 2025-08-22 13:05:22 1 43
Art
La Legion Go 2 de Lenovo终于在IFA上首次亮相,真是让人感到无比失望。经过一年的等待,我们期待的到底是什么?难道是更强大的性能?更炫酷的设计?可事实却是,这款产品的发布似乎没有带来任何令人兴奋的创新。
## 在IFA上的首次亮相:期待与失望 Lenovo的Legion Go 2在IFA上的首次亮相,原本是万众瞩目的时刻。作为一款备受期待的游戏设备,Legion Go...
بواسطة Peng Wan 2025-09-06 22:05:21 1 67
Art
Jede neue Mega-Entwicklung in Pokémon Legends: Z-A enthüllt
Pokémon, Mega-Entwicklungen, Pokémon Legends, Z-A, Dragonite, Victreebel, RPG, Spiele-News,...
بواسطة Katharina Leonie 2025-08-30 08:05:21 1 28
أخرى
Apple's first foldable could make the iPhone exciting again – but it needs this one feature
Apple's first foldable could make the iPhone exciting again – but it needs this one...
بواسطة Lana Jurčić 2025-07-13 09:19:21 0 59
إعلان مُمول
Virtuala FansOnly https://virtuala.site