【问题标题】:PLSQL function aggregate select loopPLSQL 函数聚合选择循环
【发布时间】:2021-08-05 11:00:02
【问题描述】:

我正在尝试在 PLSQL 中创建一个执行以下操作的函数:

  • 从我的 BD 获取 id 列表。
  • 在循环中对其进行迭代,并在 WHERE 中使用其属性之一执行 SELECT。
  • 将所有循环迭代结果聚合为一个变量/任何内容,并将其作为函数的结果返回。 (连接字符串逗号分隔或任何会工作)

到目前为止我得到了什么:

CREATE FUNCTION loop(OUT str text)
RETURNS text AS
$func$
DECLARE
    i text;
BEGIN
str := '';

FOR i IN
    SELECT id from public.factors
    LOOP
        str :=  str || ',' || #query - ex: select name from public.factors where factors.id = i # 
      -- Here i would like to do a select, return a single value from it and aggregate it to the existing value in str
    END LOOP;
END
$func$ LANGUAGE plpgsql;

PS:示例的逻辑是我需要做的简化版本。因此,在单个查询等中对其逻辑的任何简化都不是对原始问题的有效解决方案。

【问题讨论】:

  • 如果您在循环中使用相同的表,那么我认为您不需要为此花费这么多时间。你可以SELECT id||', '|| name from public.factors 。但是您的前任只是随机的,那么如果您在示例中更改表名会很有帮助...

标签: function loops select plsql aggregate


【解决方案1】:

这是我知道的最简单的方法:

SELECT LISTAGG (name, ',') FROM public.factors

Oracle/PLSQL LISTAGG 函数根据order_by_clause 连接每个组的列值。但是你也可以在没有group byorder by 的情况下使用它。

如果您的单元格值超过 4000 个字符,这是 oracle 中 varchar 的最大值,并且您使用的是 CLOB 之类的东西,您可以使用这个来代替更大的字符串:

SELECT XMLAGG (XMLELEMENT (NOENTITYESCAPING e, name, ',').EXTRACT ('//text()') ORDER BY name).getclobval ()
FROM public.factors

但是如果你想使用循环,那么这里就是你的例子:

CREATE FUNCTION loop(OUT str text)
RETURNS text AS
$func$
DECLARE
    v_name text;
BEGIN
str := '';

FOR i IN
    SELECT id from public.factors
    LOOP
    select name into v_name from public.factors where factors.id = i.id;
        str :=  str || ',' || v_name;
    END LOOP;
END

【讨论】:

  • LISTTAG 真的很有用。但我从未听说过或见过你的第二个解决方案,所以对此无话可说
猜你喜欢
  • 2014-09-19
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多