UNNEST 语法

最近更新时间:2024-07-11 17:43:21

我的收藏
UNNEST 可将 ARRAY 或 MAP 展开为多行数据。

语法格式

将 ARRAY 展开为单列的多行数据:
* | SELECT * FROM UNNEST(ARRAY['value1','value2',...]) AS table_name(key_name)
将 MAP 展开为多行数据:
* | SELECT * FROM UNNEST(map) AS table_name(key1_name, key2_name,...)

语法示例

将 ARRAY 展开为多行数据::
* | SELECT * FROM UNNEST(ARRAY[1,2]) AS t(number)
返回结果:
number
1
2
将 MAP 展开为多行数据:
* | SELECT * FROM UNNEST(
map_from_entries(
ARRAY[
('SQL',1974),
('Java', 1995)
]
)
) AS t(language, first_appeared_year)
返回结果:
language
first_appeared_year
SQL
1974
Java
1995
将日志内由逗号连接的响应时间字段拆分为多行数据:
原始日志:
## 第一条原始日志
rsp_time: 0.004, 0.002
url: /demo/test1

## 第二条原始日志
rsp_time: 0.006, 0.008
url: /demo/test2
检索分析语句:
* | SELECT time,url
FROM (
SELECT split(rsp_time,',') AS time_array,url
) t
CROSS JOIN UNNEST(time_array) AS t(time)
返回结果:
time
url
0.004
/demo/test1
0.002
/demo/test1
0.006
/demo/test2
0.008
/demo/test2
将日志内由逗号连接的响应时间及响应状态字段拆分为多行数据:
原始日志:
## 第一条原始日志
rsp_time: 0.004, 0.002
rsp_status: 200, 502
url: /demo/test1

## 第二条原始日志
rsp_time: 0.006, 0.008
rsp_status: 500, 404
url: /demo/test2
检索分析语句:
* | SELECT time,status,url
FROM (
SELECT zip(split(rsp_time,','),split(rsp_status,',')) as data_array,url
) t
CROSS JOIN UNNEST(data_array) AS t(time,status)
返回结果:
time
status
url
0.004
200
/demo/test1
0.002
502
/demo/test1
0.006
500
/demo/test2
0.008
404
/demo/test2