⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
展开嵌套

示例

解嵌套一个列表,生成 3 行数据 (1, 2, 3)

SELECT unnest([1, 2, 3]);

解嵌套一个结构体 (struct),生成两列 (a, b)

SELECT unnest({'a': 42, 'b': 84});

递归解嵌套列表中的结构体

SELECT unnest([{'a': 42, 'b': 84}, {'a': 100, 'b': NULL}], recursive := true);

使用 max_depth 限制递归解嵌套的深度

SELECT unnest([[[1, 2], [3, 4]], [[5, 6], [7, 8, 9], []], [[10, 11]]], max_depth := 2);

unnest 特殊函数用于将列表或结构体解嵌套一层。该函数可以像普通标量函数一样使用,但仅限于 SELECT 子句中。使用 recursive 参数调用 unnest 将对多层列表和结构体进行解嵌套。可以使用 max_depth 参数限制解嵌套深度(默认假设为 recursive 解嵌套)。

解嵌套列表 (Unnesting Lists)

解嵌套一个列表,生成 3 行数据 (1, 2, 3)

SELECT unnest([1, 2, 3]);

解嵌套一个列表,生成 3 行数据 ((1, 10), (2, 10), (3, 10))

SELECT unnest([1, 2, 3]), 10;

解嵌套两个不同大小的列表,生成 3 行数据 ((1, 10), (2, 11), (3, NULL))

SELECT unnest([1, 2, 3]), unnest([10, 11]);

从子查询中解嵌套一个列表列

SELECT unnest(l) + 10 FROM (VALUES ([1, 2, 3]), ([4, 5])) tbl(l);

空结果

SELECT unnest([]);

空结果

SELECT unnest(NULL);

在列表上使用 unnest 会为列表中的每个条目生成一行。同一 SELECT 子句中的常规标量表达式会针对生成的每一行重复执行。当在同一个 SELECT 子句中解嵌套多个列表时,这些列表会并排解嵌套。如果一个列表比另一个长,较短的列表将填充 NULL 值。

空列表和 NULL 列表解嵌套后均生成零行。

解嵌套结构体 (Unnesting Structs)

解嵌套一个结构体 (struct),生成两列 (a, b)

SELECT unnest({'a': 42, 'b': 84});

解嵌套一个结构体 (struct),生成两列 (a, b)

SELECT unnest({'a': 42, 'b': {'x': 84}});

对结构体使用 unnest 将为结构体中的每个条目生成一列。

递归解嵌套 (Recursive Unnest)

递归解嵌套列表的列表,生成 5 行数据 (1, 2, 3, 4, 5)

SELECT unnest([[1, 2, 3], [4, 5]], recursive := true);

递归解嵌套结构体的列表,生成两行两列数据 (a, b)

SELECT unnest([{'a': 42, 'b': 84}, {'a': 100, 'b': NULL}], recursive := true);

解嵌套一个结构体 (struct),生成两列 (a, b)

SELECT unnest({'a': [1, 2, 3], 'b': 88}, recursive := true);

使用 recursive 设置调用 unnest 将完全解嵌套列表,随后完全解嵌套结构体。这对于完全展平包含嵌套列表或结构体列表的列非常有用。注意,结构体内部的列表不会被解嵌套。

设置解嵌套的最大深度

max_depth 参数允许限制递归解嵌套的最大深度(默认情况下假定进行递归解嵌套,因此无需单独指定)。例如,将解嵌套深度 max_depth 设为 2 可得到以下结果

SELECT unnest([[[1, 2], [3, 4]], [[5, 6], [7, 8, 9], []], [[10, 11]]], max_depth := 2) AS x;
x
[1, 2]
[3, 4]
[5, 6]
[7, 8, 9]
[]
[10, 11]

同时,将 max_depth 设为 3 的解嵌套结果为

SELECT unnest([[[1, 2], [3, 4]], [[5, 6], [7, 8, 9], []], [[10, 11]]], max_depth := 3) AS x;
x
1
2
3
4
5
6
7
8
9
10
11

跟踪列表条目位置

要跟踪每个条目在原始列表中的位置,可以将 unnestgenerate_subscripts 结合使用

SELECT unnest(l) AS x, generate_subscripts(l, 1) AS index
FROM (VALUES ([1, 2, 3]), ([4, 5])) tbl(l);
x 索引 (index)
1 1
2 2
3 3
4 1
5 2
© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南