将 select 查询返回的列的所有值存储在变量中 - PostgreSQL

store all the values of a column returned by a select query in a variable - PostgreSQL

我有一个 table 用于维护企业内进行的交易记录。

现在我正在编写一个函数,它 return 是在 table 中找到的交易 ID。以下是函数的代码:

CREATE OR REPLACE FUNCTION searchList(inputList varchar) RETURNS character varying AS $BODY$

DECLARE
newList varchar;
rowcount integer;
splitted varchar[];

BEGIN
splitted = regexp_split_to_array(inputList,','); --splits the string by comma as a delimiter and produces an array as a result

select incidents.transaction_id into newList from incidents where transaction_id IN(select unnest(splitted)); --unnest function expands the array and is replaced by all the values of array

GET DIAGNOSTICS rowcount = ROW_COUNT; -- ROW_COUNT is the literal which is gonna provide the number of rows returned by previous query

IF rowcount = 0 THEN
return 'Match does not exist';
ELSE
return newList;
END IF;
END;
$BODY$ LANGUAGE plpgsql;

我提供一个字符串作为函数的输入,然后拆分该字符串以形成一个数组,然后我 运行 一个 select 查询,旨在存储交易 ID所有这些记录到一个变量中,该变量的事务 ID 存在于数组中,最后 return 变量

但是,当我执行此函数时,即使提供的所有 transaction_id 都匹配,我也只会得到 transaction_id 之一作为输出。

我正在使用 select into 将结果存储到变量中,但是我感觉它只存储列的一个极值 (first/last)

有什么方法可以将可能包含多个条目的单个列的结果存储到变量中。

我知道这里已经有多个线程与 select 相关,但是其中 none 有所帮助。我最近开始使用 pgsql,所以对这个主题知之甚少

如果您想 return 所有值 returned,您需要以某种方式聚合。由于您似乎想要一个逗号分隔的列表,请使用 string_agg()。但是不需要取消嵌套数组:

CREATE OR REPLACE FUNCTION searchlist(inputlist text) 
  RETURNS text AS 
$BODY$
DECLARE
  newlist text;
BEGIN
  select string_agg(transaction_id,',')
     into newlist 
  from incidents 
  where transaction_id = any (string_to_array(inputlist, ','));

  IF coalesce(newlist, '') = '' THEN
    return 'Match does not exist';
  ELSE
    return newList;
  END IF;
END;
$BODY$ 
LANGUAGE plpgsql;

我强烈建议不要传递逗号分隔值。 Postgres 正确支持数组,我会使用数组作为参数,并将数组也用作 return 值。您也不需要 PL/pgSQL 为此。

更简洁的版本(在我看来)是:

CREATE OR REPLACE FUNCTION search_list(p_inputlist int[]) 
  RETURNS int[]
AS 
$BODY$
  select array_agg(transaction_id)
  from incidents 
  where transaction_id = any (p_inputlist);
$BODY$ 
LANGUAGE sql;

唯一的区别是,这不会 return 显示 returned 数组为空的消息。如果这样做,您可以在使用该函数的代码中使用 cardinality() 来检查是否没有行被 returned.