PostgreSQL - 返回数组
Posted
技术标签:
【中文标题】PostgreSQL - 返回数组【英文标题】:PostgreSQL - RETURNING INTO array 【发布时间】:2014-11-18 21:42:13 【问题描述】:我想将更新的返回值存储到数据结构中,以便在后续查询中使用它。
在这个例子中,我得到了一个“parent_ids”列表,我想找到其父母在该数组中的所有孩子。然后,我希望更新它们的一些价值,并做其他事情。
CREATE OR REPLACE FUNCTION plpgsql_is_really_great(parent_ids bigint[])
RETURNS void AS
$$
DECLARE
found_ids bigint[];
BEGIN
UPDATE child SET
foo = bar
FROM
(SELECT id
FROM child
WHERE parent_id=ANY(parent_ids)
) as children_ids
WHERE
child.id = children_ids.id
RETURNING children_ids.id INTO found_ids; -- ???
-- do more stuff with found_ids
$$ LANGUAGE plpgsql
【问题讨论】:
这真的取决于你想用收集的 ID 做什么。通常,具有数据修改 CTE 的单个查询是最佳解决方案。 【参考方案1】:有几种方法可以解决这个问题。
假设您想为受UPDATE
影响的每个id
调用一些f(id)
。
在 PL/pgSQL 中:
$$
DECLARE found_id BIGINT;
BEGIN
FOR found_id IN (UPDATE child SET foo=bar RETURNING id) LOOP
PERFORM f(found_id);
END LOOP;
END
$$
在纯 SQL 中:
WITH updated(found_id) AS (
UPDATE child SET foo=bar RETURNING id
)
SELECT f(found_id) FROM updated;
如果你想在一个数组中收集所有found_id
s,你可以简单地:
$$
DECLARE array_var BIGINT[];
BEGIN
WITH updated(found_id) AS (
UPDATE child SET foo=bar RETURNING id
)
SELECT array_agg(found_id) FROM updated INTO array_var;
END
$$
【讨论】:
【参考方案2】:这是一个例子:
CREATE OR REPLACE FUNCTION exemplary ( parent_ids bigint[] )
RETURNS VOID AS $$
DECLARE
_found_ids bigint[];
BEGIN
WITH matching_children AS (
UPDATE child
SET foo = 1
WHERE parent_id = ANY ( parent_ids )
RETURNING id
)
SELECT array_agg ( id )
FROM matching_children
INTO _found_ids;
RAISE NOTICE '%', _found_ids;
RETURN;
END $$ LANGUAGE plpgsql;
【讨论】:
以上是关于PostgreSQL - 返回数组的主要内容,如果未能解决你的问题,请参考以下文章
postgresql中的Rails json列不接受任何值,并在存储后调用时返回nil
Hibernate,PostgreSQL:如何在数组列中搜索
如何将两个 PostgreSQL 列聚合到一个用括号分隔的数组中