【问题标题】:PostgreSQL add each item to list - DB functionsPostgreSQL 将每个项目添加到列表中 - 数据库函数
【发布时间】:2020-08-04 08:22:57
【问题描述】:

我想创建一个接受数字列表并返回数字列表的 DB 函数。对于传递给函数的列表中的每个项目,它应该检查一些条件并将其添加到响应列表中。但是,我不认为我尝试这样做的方式真的是正确的。我尝试写的基本上是一些伪代码。

CREATE OR REPLACE FUNCTION map_numbers(numbers integer[])
returns integer[]
AS 
$BODY$
   DECLARE return_list integer[];

   FOREACH field IN ARRAY numbers LOOP
      CASE
         WHEN field = 3 THEN -- add 43 (this was a random thought, but I am basically trying to map a few of the numbers to different values)
      END
   END LOOP;

RETURN QUERY SELECT * FROM return_list;
$BODY$
  LANGUAGE sql VOLATILE
  COST 100;

【问题讨论】:

    标签: sql postgresql plpgsql stored-functions


    【解决方案1】:

    您需要将其放入IF 语句中。要将 append 值传递给数组,请使用 ||

    CREATE OR REPLACE FUNCTION map_numbers(numbers integer[])
    returns integer[]
    AS 
    $BODY$
    DECLARE 
      return_list integer[] := integer[];
    BEGIN
      FOREACH field IN ARRAY numbers LOOP
        if field = 3 then 
          return_list := return_list || 43;
        elsif field = 15 then 
          return_list := return_list || 42;
        else
          return_list := return_list || field;
        end if;
      END LOOP;
      return return_list; --<< no SELECT required, just return the variable
    END;  
    $BODY$
    LANGUAGE plpgsql --<< you need PL/pgSQL, not SQL for the above
    STABLE;
    

    这也可以使用 SQL 而不是通常更有效的 PL/pgSQL 来完成:

    CREATE OR REPLACE FUNCTION map_numbers(numbers integer[])
      returns integer[]
    AS 
    $BODY$
      select array_agg(field order by idx)
      from (
        select case 
                  when field = 3 then 43
                  when field = 15 then 42
                  else field
               end as field,
               idx
        from unnest(numbers) with ordinality as t(field, idx)
      ) x;
    $BODY$
    LANGUAGE sql 
    STABLE;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-10
      • 1970-01-01
      • 2021-10-31
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多