在postgres中更改数组聚合的括号

Ste*_*ris 2 postgresql

在下面的示例中,我想将方括号“ {”和“}”更改为“ [”和“]”。我有一个带有两个列的表A,一个是字符串类型的text_1,第二个是bigint类型的计数。我正在尝试做的是返回矩阵表示法,例如[[1,2,4],[2,4,5],...]

CREATE AGGREGATE array_agg_mult(anyarray) (
    SFUNC = array_cat,
    STYPE = anyarray,
    INITCOND = '{}'
);

WITH B AS(
SELECT 
    array_agg(count) AS count 
FROM
    A 
GROUP BY
    text_1
)
SELECT
    array_agg_mult(ARRAY[count]) 
FROM
    B;
Run Code Online (Sandbox Code Playgroud)

除了如何更新array_agg_mult,如果我尝试改变INITCOND = '{}',以INITCOND = '[]'我得到的

错误:函数“ array_agg_mult”已经存在且参数类型相同

通过将json生成与postgres结合使用,可能是一个明智的解决方案。

a_h*_*ame 7

这些括号与聚合无关。这些只是数组类型的输出格式。一个新的聚合函数不会改变它。

您只需做一个

select array[1,2,3]
Run Code Online (Sandbox Code Playgroud)

将显示:

select array[1,2,3]
Run Code Online (Sandbox Code Playgroud)

'{}'INITCOND简单地是指“空数组”。

有关详细信息,请参见手册:https : //www.postgresql.org/docs/current/static/arrays.html#ARRAYS-IO

更改该显示的唯一方法是通常更改数组的输出方法。我认为,如果不入侵Postgres资源,就无法做到这一点(这可能会破坏很多事情)

如果要以其他格式显示数组,请编写自己的函数来实现。

create function format_array(p_array anyarray)
  returns text
as
$$
  select translate(p_array::text, '{}', '[]');
$$
language sql;
Run Code Online (Sandbox Code Playgroud)

然后,您可以在任何数组上使用它:

select format_array(array[1,2,3]), 
       format_array('{}'::int[]), 
       format_array(array[[1,2,3],[4,5,6]]);
Run Code Online (Sandbox Code Playgroud)

将输出:

array  
-------
{1,2,3}
Run Code Online (Sandbox Code Playgroud)

当然你也可以在申请更多的“化妆品” format_array()功能,然后只需更换{}[]


您的查询将变为:

WITH B AS
(
  SELECT array_agg(count) AS count 
  FROM A 
  GROUP BY text_1
)
SELECT format_array(array_agg_mult(ARRAY[count]))
FROM B;
Run Code Online (Sandbox Code Playgroud)