0

例如,我有表users(id、name、email)。有表photos(id,值) 有一个表userphotos,由关系组成:user_id,photo_id。

我需要一个函数来以这种方式获取所有用户的照片:

  1. id1 姓名1 电子邮件1 照片1
  2. id2 姓名2 电子邮件2 照片2

等等

用户的照片数量未知。

如何创建 plpgsql 函数来创建这样的结果?

CREATE OR REPLACE FUNCTION test_function()
  RETURNS TABLE(id int, name character varying, email character varying,  photos int[]) AS $
DECLARE
    u RECORD;
BEGIN
    FOR u IN SELECT * FROM users LOOP
        return NEXT u; -- will return user without photos
    -- but how to populate u with photos as array
    -- got from query:
    --          SELECT photo_id FROM userphotos WHERE user_id = u.id
    END LOOP;
END;
$ LANGUAGE plpgsql

PostgreSQL 版本。9.0。

4

1 回答 1

2

可能看起来像这样:

CREATE OR REPLACE FUNCTION test_function()
  RETURNS TABLE(id int, name varchar, email varchar, photos int[]) AS
$func$
BEGIN

RETURN QUERY
SELECT u.id, u.name, u.email, array_agg(up.photo_id)  -- AS photo_ids
FROM   users u
LEFT   JOIN userphotos up ON  up.user_id = u.id
GROUP  BY u.int, u.name, u.email;

END
$func$ LANGUAGE plpgsql
  • 使用正确的引用。阅读有关美元报价的手册。
  • RETURN QUERY用作从 plpgsql 函数返回行的最简单方法。没有LOOP必要。
  • 其中LEFT JOIN包括根本没有照片的用户。
  • 小心命名冲突。子句中的所有OUT参数在RETURNS TABLE正文中随处可见。

评论后补充

如果你想加入多个1:n 表,你不能一次加入它们。这就是会发生的事情:
https ://stackoverflow.com/a/12464135/939860

另一个与此问题的解决方案密切相关的答案:
https ://stackoverflow.com/a/14110017/939860

于 2013-01-03T01:24:15.903 回答