【问题标题】:Creating a Postgres function that returns JSON创建一个返回 JSON 的 Postgres 函数
【发布时间】: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


【解决方案1】:

返回的数据被设置为“字符”而不是“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;
$$;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多