【问题标题】:How to select from a variable in Postgresql?如何从 Postgresql 中的变量中进行选择?
【发布时间】:2021-09-30 04:24:35
【问题描述】:

我正在创建一个函数,我需要从平均分计算中获得最大和最小的结果。到目前为止,它看起来像这样:

CREATE OR REPLACE FUNCTION public.my_func()
    RETURNS NUMERIC
    LANGUAGE plpgsql
    AS $function$
DECLARE
    all_user_average_scores record;
    max_avg numeric;
    min_avg numeric;
BEGIN
    
        SELECT user_uuid, AVG(score) as avg_score
            INTO all_user_average_scores
            FROM user_scores
            GROUP BY user_uuid;

    SELECT max(avg_score) INTO max_raw FROM all_user_average_scores;
    SELECT min(avg_score) INTO min_raw FROM all_user_average_scores;

    -- Do some more stuff here

    RETURN final_result;
END;
$function$;

但我收到此错误:

ERROR:  relation "all_user_average_scores" does not exist

有什么想法吗?我也尝试了:= 语法,得到了相同的结果

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    如您所见,您不能使用像表格这样的变量。此外,SELECT ... INTO 只会将结果集的第一行存储在变量中。

    在你的情况下,你根本不需要变量:

    SELECT max(avg_score), min(avg_score) INTO max_raw, min_raw
    FROM (SELECT AVG(score) as avg_score
          FROM user_scores
          GROUP BY user_uuid) AS q;
    

    或者,您可以使用 CTE:

    WITH q AS (
       SELECT AVG(score) as avg_score
       FROM user_scores
       GROUP BY user_uuid
    )
    SELECT max(avg_score), min(avg_score) INTO max_raw, min_raw
    FROM q;
    

    对于更复杂的情况,临时表可能是最好的解决方案。

    【讨论】:

      【解决方案2】:

      事实证明,您无法将表格保存在变量中。解决方案是使用this post中描述的临时表

      【讨论】:

      • 这个不需要临时表
      猜你喜欢
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 2020-08-17
      • 2014-12-02
      • 1970-01-01
      • 2012-07-21
      • 2014-01-13
      相关资源
      最近更新 更多