IMPLODE
接受任何标量类型的一列并返回一个无界数组。结合 GROUP BY,此函数可用于反转 EXPLODE 操作。
行为类型
语法
IMPLODE (input-column [ USING PARAMETERS param=value[,...] ] )
[ within-group-order-by-clause ]
参数
- input-column
- 要从中创建数组的任何标量类型的列。
- within-group-order-by-clause
- 对每个输出数组组中的元素进行排序:
WITHIN GROUP (ORDER BY { column-expression[ sort-qualifiers ] }[,...])
sort-qualifiers:
{ ASC | DESC [ NULLS { FIRST | LAST | AUTO } ] }
提示
WITHIN GROUP ORDER BY 会消耗每个组的大量内存。为了最大限度地减少内存消耗,请创建支持 GROUPBY PIPELINED 的投影。
参数
allow_truncate
- Boolean 值,如果为 true,则当输出长度超过列大小时截断结果。如果为 false(默认值),则当输出数组过大时,该函数将返回错误。
即使此参数设置为 true,如果任何单个数组元素过大,IMPLODE 也会返回错误。截断从输出数组中移除元素,但不改变单个元素。
max_binary_size
- 返回数组的最大二进制大小(以字节为单位)。如果忽略此参数,IMPLODE 将使用配置参数 DefaultArrayBinarySize 的值。
示例
考虑使用包含以下内容的表:
=> SELECT * FROM filtered;
position | itemprice | itemkey
----------+-----------+---------
0 | 14.99 | 345
0 | 27.99 | 567
1 | 18.99 | 567
1 | 35.99 | 345
2 | 14.99 | 123
(5 rows)
以下查询调用 IMPLODE 将价格组合为数组(按键分组):
=> SELECT itemkey AS key, IMPLODE(itemprice) AS prices
FROM filtered GROUP BY itemkey ORDER BY itemkey;
key | prices
-----+-------------------
123 | ["14.99"]
345 | ["35.99","14.99"]
567 | ["27.99","18.99"]
(3 rows)
您可以通过包括 WITHIN GROUP ORDER BY 子句来修改此查询,该子句指定如何对每个组中的数组元素进行排序:
=> SELECT itemkey AS key, IMPLODE(itemprice) WITHIN GROUP (ORDER BY itemprice) AS prices
FROM filtered GROUP BY itemkey ORDER BY itemkey;
key | prices
-----+-------------------
123 | ["14.99"]
345 | ["14.99","35.99"]
567 | ["18.99","27.99"]
(3 rows)
有关更完整的示例,请参阅数组和集(集合)。