IMPLODE

接受任何标量类型的一列并返回一个无界数组。结合 GROUP BY,此函数可用于反转 EXPLODE 操作。

行为类型

  • 不可变,如果 WITHIN GROUP ORDER BY 子句指定解析为每个输出数组组中唯一元素值的列或列集。

  • 易变,否则因为结果是不可交换的。

语法

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 } ] }

参数

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)

有关更完整的示例,请参阅数组和集(集合)