在下面的示例中,我想将方括号“ {”和“}”更改为“ [”和“]”。我有一个带有两个列的表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结合使用,可能是一个明智的解决方案。
这些括号与聚合无关。这些只是数组类型的输出格式。一个新的聚合函数不会改变它。
您只需做一个
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)
| 归档时间: |
|
| 查看次数: |
1387 次 |
| 最近记录: |