创建一个返回 JSON 的 Postgres 函数

问题描述

我创建了一个查询以将数据作为对象数组返回,它工作正常,但我无法让它作为 Postgres 函数工作,因此我可以在其他查​​询中调用它以返回包含该数组的列。

SELECT json_agg(json_build_object(
    'first_name',u.first_name,'last_name',u.last_name,'username',u.username,'photo',p.filename
)) friends
FROM events e
     INNER JOIN user_events ue ON ue.event_uid::uuid = e.uid
     INNER JOIN users u ON u.uid = ue.user_uid::uuid
     INNER JOIN user_followers uf ON uf.user_uid::uuid = u.uid
     LEFT JOIN photographs p on p.uid = u.profile_photograph_uid::uuid
WHERE e.uid = '00000000-0000-0000-0000-000000000000'
AND uf.follower_uid = '00000000-0000-0000-0000-000000000000';

我创建的函数是这样的,当我添加查询时它会抛出错误

CREATE OR REPLACE FUNCTION friends_attending(event_uid uuid,user_uid uuid)
RETURNS TABLE
        (
            friends character

        )
language plpgsql
AS
$$
BEGIN
RETURN QUERY
    SELECT json_agg(json_build_object(
            'first_name',p.filename
        )) friends
    FROM events e
             INNER JOIN user_events ue ON ue.event_uid::uuid = e.uid
             INNER JOIN users u ON u.uid = ue.user_uid::uuid
             INNER JOIN user_followers uf ON uf.user_uid::uuid = u.uid
             LEFT JOIN photographs p on p.uid = u.profile_photograph_uid::uuid
    WHERE e.uid = $1
      AND uf.follower_uid = $2;
END;
$$;

我在另一个查询中使用了这个函数

 friends_attending(e.uid,'00000000-0000-0000-0000-000000000000')

返回的错误

[42883] ERROR: operator does not exist: character = uuid 
Hint: No operator matches the given name and argument types. You might need to add explicit type casts. 
Where: PL/pgsql function friends_attending(uuid,uuid) line 3 at RETURN QUERY

我尝试向函数的各个部分添加类型转换,但似乎没有任何效果

解决方法

返回的数据被设置为 'character' 而不是 'json' & 那里的最后一个子句需要被转换为 uuid。

CREATE OR REPLACE FUNCTION friends_attending(event_uid uuid,user_uid uuid)
RETURNS TABLE
        (
            friends json

        )
language plpgsql
AS
$$
BEGIN
RETURN QUERY
    SELECT json_agg(json_build_object(
            'first_name',u.first_name,'last_name',u.last_name,'username',u.username,'photo',p.filename
        )) friends
    FROM events e
             INNER JOIN user_events ue ON ue.event_uid::uuid = e.uid
             INNER JOIN users u ON u.uid = ue.user_uid::uuid
             INNER JOIN user_followers uf ON uf.user_uid::uuid = u.uid
             LEFT JOIN photographs p on p.uid = u.profile_photograph_uid::uuid
    WHERE e.uid = $1
      AND uf.follower_uid::uuid = $2;
END;
$$;