postgresql - 如何在 postgreSQL 中填充集合
问题描述
我对 PostgreSQL 很陌生,我正在处理迁移任务。我正在寻找 PostgreSQL 中“批量收集到”语法的替代方法,或者我如何在 PostgreSQL 中实现此功能。
CREATE FUNCTION test."printEmpIds"()
RETURNS test.emp_add
LANGUAGE 'plpgsql'
COST 100
VOLATILE
AS $BODY$
declare
empIds test.emp_add;
begin
select ids bulk collect empIds from test.emp;
-- for idx in 1..empIds.count loop
-- raise notice '%%%', empIds.idx;
-- end loop;
return empIds;
end;
$BODY$;
ALTER FUNCTION test."printEmpIds"()
OWNER TO postgres;
基本上我想将emp表中的所有ID填充到用户定义的集合empIds中并返回
任何帮助将是可观的?
解决方案
INT[]
在 Postgres 中,您可以通过执行ARRAY_AGG
from select来返回一个整数数组
测试数据
create table emp ( ids INTEGER );
insert into emp(ids) values(1),(2),(3);
功能
CREATE OR REPLACE FUNCTION printempids ()
RETURNS INT[]
LANGUAGE plpgsql
COST 100 volatile as $body$
declare empids int[];
BEGIN
SELECT array_agg(ids) INTO empids
FROM emp;
RETURN empids;
END;
$body$;
结果
knayak=# select printempids ();
printempids
-------------
{1,2,3}
(1 row)
要将它们作为行,您可以这样做
select * FROM UNNEST(printempids ()) as id;
尽管此功能可以TABLE
使用集合复制 Oracle 的功能,但我建议您在 Postgres 中使用RETURNS TABLE
andRETURN QUERY SELECT ..
代替。
CREATE OR REPLACE FUNCTION printempids ()
RETURNS TABLE ( p_ids INT )
LANGUAGE plpgsql
COST 100 volatile as $body$
declare empids int[];
BEGIN
RETURN QUERY SELECT ids
FROM emp;
END;
$body$;
结果
knayak=# select printempids ();
printempids
-------------
1
2
3
(3 rows)
或者一个简单的 SQL 函数也可以。
CREATE OR REPLACE FUNCTION printempids ()
RETURNS TABLE ( ids INT ) as
$body$
SELECT ids FROM emp;
$body$ LANGUAGE SQL
COST 100 volatile;
推荐阅读
- react-native - 在反应导航中导航到不同的堆栈
- angular - 我不明白为什么这些图标不起作用
- angular - HttpClient 的 Observable 无法从 HttpResponse 正确映射
- java - 如何知道所有异步 HTTP 调用已完成
- javascript - 是否可以分段运行循环?- JavaScript
- php - 在页面滚动上加载数据在移动浏览器中不起作用
- python - 将 a 的各个部分分开
并将其打印到屏幕上 - c# - 如何将包含编号列表的字符串拆分为多个字符串?
- regex - 不应该允许的正则表达式模式,;:|
- php - 如何阻止终端与输出在同一行启动