有什么有效的函数可以用来按位置增加数组中元素的数量?
例如,如果我有一个数组:
ARRAY[10,20,30,40,50]::INT[]
我想变成:
ARRAY[10,20,20,30,30,30,40,40,40,40,50,50,50,50,50]::INT[]
因此我有1个“ 10”,2个“ 20”,3个“ 30”,4个“ 40”和5个“ 50”。
对于数组:
ARRAY[10,20,30,40,10]::INT[]
我想变成:
ARRAY[10,20,20,30,30,30,40,40,40,40,10,10,10,10,10]::INT[]
这样我就有6个“ 10”,2个“ 20”,3个“ 30”和4个“ 40”。
WITH t AS (SELECT ARRAY[10,20,30,40,50]::INT[] AS arr) -- variable for demo
SELECT ARRAY(
SELECT unnest(array_fill(arr[idx], ARRAY[idx])) AS mult
FROM (SELECT arr, generate_subscripts(arr, 1) AS idx FROM t) sub
);
我将逻辑包装到一个简单的IMMUTABLE SQL函数中:
CREATE OR REPLACE FUNCTION f_expand_arr(_arr anyarray)
RETURNS anyarray AS
$func$
SELECT ARRAY(
SELECT unnest(array_fill(_arr[idx], ARRAY[idx]))
FROM (SELECT generate_subscripts(_arr, 1) AS idx) sub
)
$func$ LANGUAGE sql IMMUTABLE;
由于多态参数类型,适用于任何基本类型的数组anyarray
:
如何编写返回文本或整数值的函数?
手动上generate_subscripts()
和array_fill()
。
注意:这适用于实际的数组索引,它可能与Postgres中的顺序数组位置不同。您可能对@Daniel的“标准化”数组索引的方法感兴趣:
对一维数组的数组下标进行标准化,使其以1开头
即将发布的Postgres 9.4(当前为beta)提供WITH ORDINALITY
:
PostgreSQL unnest(),元素编号
允许这种更加优雅和可靠的解决方案:
CREATE OR REPLACE FUNCTION f_expand_arr(_arr anyarray)
RETURNS anyarray AS
$func$
SELECT ARRAY(
SELECT unnest(array_fill(a, ARRAY[idx]))
FROM unnest(_arr) WITH ORDINALITY AS x (a, idx)
)
$func$ LANGUAGE sql IMMUTABLE;
有人可能还会说,实际上并不能保证适当的秩序。我声称它是...
并行unnest()和PostgreSQL中的排序顺序
呼叫:
SELECT f_expand_arr(ARRAY[10,20,30,40,10]::INT[]) AS a2;
或对于表中的值:
SELECT f_expand_arr(a) AS a2 FROM t;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句