问题描述
我创建了一个查询以将数据作为对象数组返回,它工作正常,但我无法让它作为 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;
$$;