SQL 方言通

首页 / 数组和 Map

POSEXPLODE 带下标展开数组

POSEXPLODE 把数组展开成多行,同时输出元素在数组中的位置,位置从 0 开始。MaxCompute、Doris、Hive 和 Spark 支持;Hologres、StarRocks 和 Flink 的文档中没有带位置的展开函数,需要另行改写。

各引擎写法 · 迁移注意事项 · 示例

各引擎写法

引擎支持写法说明依据
MaxCompute支持POSEXPLODE(array)每个元素一行,两列分别是从 0 开始的下标和元素值。官方文档
Hologres不支持—数组函数文档中只有 UNNEST,没有同时返回位置的写法。官方文档
StarRocks不支持—UNNEST 文档中没有返回元素位置的参数或 WITH ORDINALITY 写法。官方文档
Doris支持POSEXPLODE(array)配合 LATERAL VIEW 使用,返回包含位置和元素的 STRUCT,位置从 0 开始。数组为 NULL 或为空时不输出行;需要保留这类行时用 POSEXPLODE_OUTER。官方文档
Hive支持posexplode(ARRAY<T> a)Hive 0.13.0 起提供。返回 pos 和 val 两列,pos 从 0 开始。官方文档
Spark SQL支持posexplode(expr)Spark 2.0.0 起提供,也可以展开 Map,位置从 0 开始。官方文档
Flink SQL不支持—内置函数文档中没有 POSEXPLODE,也没有说明 UNNEST 支持 WITH ORDINALITY。官方文档

迁移注意事项

示例

展开商品列表并保留顺序

MaxCompute
SELECT order_id, pos, item FROM orders LATERAL VIEW POSEXPLODE(items) t AS pos, item;
Doris
SELECT order_id, pos, item FROM orders LATERAL VIEW POSEXPLODE(items) t AS pos, item;
Hive
SELECT order_id, pos, item FROM orders LATERAL VIEW posexplode(items) t AS pos, item;
Spark SQL
SELECT order_id, pos, item FROM orders LATERAL VIEW posexplode(items) t AS pos, item;

同类函数

核对日期: · 提交勘误