PL/pgSQL函数含IF语句与变量时出现语法错误求助
PL/pgSQL函数语法错误修正及说明
第一个函数的问题与修正
你的第一个函数存在多处语法错误:
DECLARE块位置错误:PL/pgSQL 中变量声明必须放在BEGIN之前,不能嵌套在BEGIN内部IF语句未闭合:PL/pgSQL 的IF结构必须以END IF;收尾- RETURN 语句有多余括号:最后多了一个右括号,导致语法不匹配
- 类型转换问题:
AVG()函数返回numeric类型,直接赋值给int变量需要显式转换
修正后的代码:
create or replace function weight_from_days_ago (days_ago int, difficulty int, user_level int, root_score int) returns int as $$ declare average_days_ago int := (select avg(days_ago)::int); -- 显式转换为int类型 begin if average_days_ago = 0 then average_days_ago := 1; end if; -- 闭合IF语句 return (coalesce(days_ago, 0) / average_days_ago) + abs(difficulty - user_level) + root_score; -- 移除多余括号,简化冗余select end; $$ language plpgsql;
注意:如果 avg(days_ago) 是要查询某张表的平均值,需要补充表名(比如 select avg(days_ago)::int from your_table;),否则当前写法会把输入参数 days_ago 当作字段名,导致逻辑错误。
第二个函数的问题与修正
PL/pgSQL 中不能在表达式内部直接使用 IF...THEN...ELSE 流程控制语句,这类场景要改用 CASE 条件表达式。同时你的语句存在括号不匹配问题。
修正后的代码:
create or replace function weight_from_days_ago (days_ago int, difficulty int, user_level int, root_score int) returns int as $$ begin return (coalesce(days_ago, 0) / case when (select avg(days_ago)::int) = 0 then 1 else (select avg(days_ago)::int) end) + abs(difficulty - user_level) + root_score; end; $$ language plpgsql;
同样,这里的 avg(days_ago) 如果是表字段,需要补充表名,否则逻辑会出错。
内容的提问来源于stack exchange,提问作者madherring
相关产品推荐
相关产品推荐

