将 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.
我有一个 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.