use*_*277 11 sql postgresql function plpgsql
如何创建一个函数,该函数使用参数integer []参数并使用IN子句在循环中使用此参数执行查询.在循环中我想要执行下一个选择和我希望返回的此查询的结果.
像这样的东西:
CREATE OR REPLACE FUNCTION function_which_i_want(my_argument integer[]) RETURNS my_schema_and_table[] AS
$BODY$
DECLARE
result my_schema_and_table[];
BEGIN
FOR l IN SELECT * FROM table2 WHERE id in (my_argument) LOOP
SELECT * FROM my_schema_and_table;
END LOOP;
END;
...
Run Code Online (Sandbox Code Playgroud)
我希望得到每个select循环的联合.一个巨大的联合结果.这可能吗?请帮忙.
填写问题中的空白,它可能如下所示:
CREATE OR REPLACE FUNCTION func1(_arr integer[])
RETURNS SETOF target_table LANGUAGE plpgsql AS
$func$
DECLARE
l record;
BEGIN
FOR l IN
SELECT *
FROM lookup_table
WHERE some_id = ANY(_arr)
LOOP
RETURN QUERY
SELECT *
FROM target_table
WHERE link_id = l.link_id;
END LOOP;
END
$func$;
Run Code Online (Sandbox Code Playgroud)
如果你想要返回结果,SELECT * FROM my_schema_and_table;你必须以不同的方式进行整个功能.声明为RETURNS SETOF target_table
假设你真的想要一个SET来自你的行target_table,而不是一个数组?
将IN构造重写为= ANY(_arr).这是直接使用数组参数的方法.在内部,PostgreSQL = ANY()无论如何都会重写IN表达式.测试EXPLAIN ANALYZE一下,亲自看看.
或者使用构造,unnest()并像@Clodoaldo演示一样加入到结果表中.长阵列的速度更快.
以上仍然是毫无意义的设计.简化为执行相同操作的SQL函数:
CREATE OR REPLACE FUNCTION func2(_arr integer[])
RETURNS SETOF target_table LANGUAGE sql AS
$func$
SELECT t.*
FROM (SELECT unnest($1) AS some_id) x
JOIN lookup_table l USING (some_id)
JOIN target_table t USING (link_id); -- assuming both tables have link_id
$func$
Run Code Online (Sandbox Code Playgroud)
呼叫:
SELECT * FROM func2('{21,31}'::int[]);
Run Code Online (Sandbox Code Playgroud)
CREATE OR REPLACE FUNCTION function_which_i_want(my_argument integer[])
RETURNS my_schema_and_table[] AS
$BODY$
DECLARE
result my_schema_and_table[];
BEGIN
for l in
select t.*
from
table2 t
inner join
unnest(my_argument) m(id) on m.id = t.id
loop
SELECT * FROM my_schema_and_table;
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12378 次 |
| 最近记录: |