将整列发送到函数并逐行检查

时间:2014-08-29 12:00:26

标签: sql postgresql aggregate-functions plpgsql

我想将整列发送到我的功能!像函数min()max()这样的东西有可能吗? 如何逐行检查查询结果?我写了类似的东西:

CREATE OR REPLACE FUNCTION gowno.kiki(temppp INTEGER ) RETURNS INTEGER AS
$$
DECLARE
val INTEGER := 0;
i tyczka%ROWTYPE;

BEGIN
    FOR i IN (SELECT adres FROM tyczka)
    LOOP
        RETURN CAST(i.adres AS INTEGER);
        IF CAST(i.adres AS INTEGER) > val THEN
            val = CAST(i.adres_ AS INTEGER);
        END IF;
    END LOOP;
    RETURN val;
END
$$
LANGUAGE 'plpgsql'

例如,我有类似下表的内容。我想计算列poziom_wody中字段与id相同的字段之间的差异。

enter image description here

1 个答案:

答案 0 :(得分:0)

您的函数的语法将如下所示:

CREATE OR REPLACE FUNCTION foo(temppp int)
  RETURNS INTEGER AS
$func$
DECLARE
   val int := 0;
   i   tyczka;
BEGIN
   FOR i IN
      SELECT * FROM tyczka
   LOOP
      RETURN i.adres::int;
      IF i.adres::int > val THEN
         val := i.adres::int;
      END IF;
   END LOOP;
   RETURN val;
END
$func$  LANGUAGE plpgsql;

根据您的表格定义,这可以进一步简化。

根据您想要达到的目标,可能有一种优越的基于集合的方法。循环通常是关系数据库中的最后手段。

这是最好的场合,但是来自程序语言的人往往会过度使用循环。

添加了示例

使用相同的poziom_wody得出最大值和最小值id_rzeki之间的差异:

SELECT max(poziom_wody) - min(poziom_wody) AS diff
FROM   tbl
WHERE  id_rzeki = 2;

这适用于任意数量的行。