PostgreSQL 9.2:对每个数组成员应用操作

时间:2014-01-15 21:29:55

标签: postgresql

假设我正在尝试在数组上应用2除法

SELECT unnest(array[1.0, 2.0, 3.0])::REAL/2

这给了我三行,值为0.5,1.0和1.5。

我如何继续将其转换回数组?我试过了

SELECT array_agg(unnest(array[1.0, 2.0, 3.0])::REAL/2)

但我明白了:ERROR: set-valued function called in context that cannot accept a set

额外的问题:我如何解决同样的问题,但是在多维数组上?

SELECT unnest(array[[1.0, 0.1], [2.0, 0.2]])::REAL/2

我想要一个像"{{0.5,0.05},{1.0,0.1}}"

这样的答案

2 个答案:

答案 0 :(得分:3)

关于您的第一个问题,您只需执行以下操作即可将结果集转换为ARRAY

SELECT ARRAY (SELECT unnest(array[1.0, 2.0, 3.0])::REAL/20) 

答案 1 :(得分:1)

第一部分很简单 - 您只需添加一个额外的级别来聚合所有内容。

select array_agg(val/2)
from (select unnest(array[1.0, 2.0, 3.0]) val) t
;

至于多维案例,也许这样的事情很尴尬?

create aggregate array_array_agg(anyarray) (
  sfunc=array_cat,
  stype=anyarray
)
;

select array_array_agg(val)
from
(
  select (select array[array_agg(val/2)]
          from (select unnest((array[[1.0, 0.1], [2.0, 0.2]])[i:i]) val) t) val
  from generate_series(1, array_length(array[[1.0, 0.1], [2.0, 0.2]], 1)) as i
) t
;

使用数组索引和generate_series来遍历每个数组,然后在第一步中应用逻辑。我不确定它会变得多清洁。