⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
展开嵌套

示例

解嵌套列表,生成3行 (1, 2, 3)

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

解嵌套结构体,生成两列 (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 解嵌套,无需单独指定)。

解嵌套列表

解嵌套列表,生成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 列表都解嵌套为零行。

解嵌套结构体

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

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

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

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

对结构体使用 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);

解嵌套结构体,生成两列 (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

跟踪列表条目位置

为了跟踪每个条目在原始列表中的位置,unnest 可以与 generate_subscripts 结合使用。

SELECT unnest(l) AS x, generate_subscripts(l, 1) AS index
FROM (VALUES ([1, 2, 3]), ([4, 5])) tbl(l);
x 索引
1 1
2 2
3 3
4 1
5 2