我正试图array_agg在Postgresql中使用数组类型,但我无法弄清楚这是否可行,如果可行,该怎么做.我的查询的相关部分如下所示:
array_agg(ARRAY[e.alert_type::text, e.id::text, cast(extract(epoch from e.date_happened) as text)] order by e.date_happened asc, e.id asc)
Run Code Online (Sandbox Code Playgroud)
我得到的错误是 ERROR: could not find array type for data type text[]
这是可能的还是我应该尝试寻找另一种方法?
谢谢!
您可以编写自定义聚合来处理特定的数组数组,例如:
DROP TABLE IF EXISTS e;
CREATE TABLE e
(
id serial PRIMARY KEY,
alert_type text,
date_happened timestamp with time zone
);
INSERT INTO e(alert_type, date_happened) VALUES
('red', '2011-05-10 10:15:06'),
('yellow', '2011-06-22 20:01:19');
CREATE OR REPLACE FUNCTION array_agg_custom_cut(anyarray)
RETURNS anyarray
AS 'SELECT $1[2:array_length($1, 1)]'
LANGUAGE SQL IMMUTABLE;
DROP AGGREGATE IF EXISTS array_agg_custom(anyarray);
CREATE AGGREGATE array_agg_custom(anyarray)
(
SFUNC = array_cat,
STYPE = anyarray,
FINALFUNC = array_agg_custom_cut,
INITCOND = $${{'', '', ''}}$$
);
Run Code Online (Sandbox Code Playgroud)
查询:
SELECT
array_agg_custom(
ARRAY[
alert_type::text,
id::text,
CAST(extract(epoch FROM date_happened) AS text)
])
FROM e;
Run Code Online (Sandbox Code Playgroud)
结果:
array_agg_custom
--------------------------------------------
{{red,1,1305036906},{yellow,2,1308787279}}
(1 row)
Run Code Online (Sandbox Code Playgroud)
编辑:
这是第二种,更短的方式(也就是说,你不需要array_agg_custom_cut函数,但是你ARRAY在查询中看到了额外的级别):
CREATE AGGREGATE array_agg_custom(anyarray)
(
SFUNC = array_cat,
STYPE = anyarray
);
SELECT
array_agg_custom(
ARRAY[
ARRAY[
alert_type::text,
id::text,
CAST(extract(epoch FROM date_happened) AS text)
]
])
FROM e;
Run Code Online (Sandbox Code Playgroud)
结果:
array_agg_custom
--------------------------------------------
{{red,1,1305036906},{yellow,2,1308787279}}
(1 row)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13020 次 |
| 最近记录: |