首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数遍历数组元素的语法?

函数遍历数组元素的语法?
EN

Stack Overflow用户
提问于 2018-12-31 05:35:28
回答 1查看 87关注 0票数 1

这是我第一次尝试在Postgres中构建函数,并且第一次使用数组。还有第一个关于堆栈溢出的问题!

有一个2级数字数组的{{a1,b1},{a2,b2}...{ai,bi}}。试图计算三件事:

  1. 希望循环遍历和乘每个子数组ie (a1 * b1),然后在数组中积累,直到达到一个特定的数字(x)达到ie (a1 * b1) + (a2 * b2)... + ...(ai * bi) >= x为止。因此,ai * bi是第一个将积累推到x之上的子数组。我想还这个累积的数字。
  2. 累积b.即(b1 + b2 +...+ bi).
  3. 哎。

在循环之外,我想做一些涉及这三个数字的计算。

还没有包括一个DO来本地化变量,但如果可能的话,那就太好了。

看大约100万行。每一行可能包含主数组中的数百个子数组元素,但我不可能需要超过8个子数组乘以每一行并将其相加。

Postgres 9.6

我已经看过foreach和片入数组,但不确定在本例中是否适合使用。也不确定不安乐窝是否有什么好处。目前没有索引。

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION accum (numeric[i],numeric[i]) RETURNS numeric AS 
$$

DECLARE
x integer := 100;
y numeric;
z numeric;

BEGIN
  LOOP

-- Accumulate subarray products
  y := SELECT(ANYARRAY)[i:i][1:1]*SELECT(ANYARRAY)[i:i][2:2] + y;

-- Accumulate 2nd element of subarrays
  z := SELECT(ANYARRAY)[i:i][2:2] + z;

EXIT WHEN y > x; 

END LOOP;

RETURN y,
       z,
       -- Return first element of subarray that makes y > x
       SELECT(ANYARRAY)[i:i][1:1];

"Calculation involving output"

END
$$
LANGUAGE plpgsql
;

我不知道如何从一个循环返回多个输出。目的是从这个函数中得到一个数字输出。任何帮助的语法,或方法,我将如何处理这将是非常感谢!在没有函数的情况下,能做到这一切吗?感谢您的阅读。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-31 07:29:01

Postgres中的多维数组不是直接实现的,因为子数组不是“元素”,我建议您使用类型的 of (a,b),然后传递该类型的数组。以这种方式引用元素比较容易。

创建类型的

代码语言:javascript
复制
create type abtype AS( a numeric, b numeric);

函数

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION accum (abtyparray abtype[]) RETURNS numeric AS 
$$

DECLARE
x integer := 100;
ab abtype;
y numeric := 0;
z numeric := 0;

BEGIN

   FOREACH ab IN ARRAY abtyparray 
   LOOP
     y := y + ab.a * ab.b; --(a1 * b1) + (a2 * b2)... + ...(ai * bi) 
     z := z + ab.b;  --Cumulative b
     EXIT WHEN y > x; 
   END LOOP;
     RAISE NOTICE 'y = %, z= %,ai = % ', y,z,ab.a;
                                            --^ai
    RETURN y;

END
$$
LANGUAGE plpgsql;

执行

代码语言:javascript
复制
knayak=# DO $$
knayak$# BEGIN
knayak$# PERFORM  accum (ARRAY[(3,4),(10,9),(17,19)] ::abtype[] ) ;
knayak$# END $$;
NOTICE:  y = 102, z= 13,ai = 10
DO

Demo

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53983952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档