【发布时间】:2021-03-02 16:40:46
【问题描述】:
我创建了一个查询以将数据作为对象数组返回,它工作正常,但我无法让它作为 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';
我创建的函数是 this,当我添加到查询中时它会引发错误。
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', 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 = $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
我尝试向函数的各个部分添加类型转换,但似乎没有任何效果。
【问题讨论】:
-
friends_attending(e.uid, '00000000-0000-0000-0000-000000000000'::uuid) -
请注意 Postgres 9.5 是 no longer supported - 您应该尽快计划升级。
-
谢谢,我在发布后 2 分钟修复了它,典型的!我错过了最终 AND 的类型转换以及需要将返回的数据设置为 json。
标签: sql json postgresql postgresql-9.5