MySQL创建函数错误

时间:2012-10-17 22:02:41

标签: mysql function if-statement procedure

我需要创建一个函数,根据书籍主题给出平均书价。该功能的规则是:

a)如果参数为null,则返回null

b)如果参数与我们在主题表中的任何主题ID不匹配,则返回值-2

c)如果参数与主题表中的主题ID匹配,但我们没有任何书籍 该主题,返回值为-1

create function AvgPriceByTopic(
p_subject varchar(20))
RETURNS decimal(8,2)
begin
declare v_avgPrice decimal(8,2);
declare v_avgListPrice decimal(8,2);

if p_subject is null then
    set v_avgPrice := null;
elseif exists (
        select avg(list_price) into v_avgListPrice
        from books 
        where topic_id = p_subject
        group by book_id
        limit 1 ) then
    set v_avgPrice := v_avgListPrice;
else 
    set v_avgPrice := -2;
end if;

return v_avgPrice;
end;
#

我收到一条错误消息:

 ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
 corresponds to your MySQL server version for the right syntax to use near 
  'into v_avgListPrice from books' at line 11

有什么建议可以摆脱这个错误吗?有时我的语法有问题...提前谢谢。

2 个答案:

答案 0 :(得分:0)

由于“这样的SELECT必须将其结果返回到外部上下文”,请参阅using select into using user-defined variables。我会尝试在第一个if语句之外提取select,如:

select avg(list_price) into v_avgListPrice
        from books 
        where topic_id = p_subject
        group by book_id
        limit 1;
if p_subject is null then
    set v_avgPrice := null;
elseif v_avgListPrice is not null then
    set v_avgPrice := v_avgListPrice;
else 
    set v_avgPrice := -2;
end if;

答案 1 :(得分:0)

首先,您需要移动查询{@ 1}}之外的平均值,如@dan建议的那样。

但我发现该查询存在问题:它按book_id进行分组并限制,然后尝试将其限制为第一行。首先,这不会导致按主题划分的平均价格,因为它不按主题分组,只会导致每本书的价格。请尝试以下方法:

EXISTS

请记住更改分隔符,以便MySQL不会将函数中的分号解释为delimiter $$ create function AvgPriceByTopic( p_subject varchar(20)) RETURNS decimal(8,2) begin declare v_avgPrice decimal(8,2); declare v_avgListPrice decimal(8,2); if p_subject is null then set v_avgPrice := null; elseif not exists (select * from topics where topic_id = p_subject) then set v_avgPrice := -2; elseif not exists (select * from books where topic_id = p_subject) then set v_avgPrice := -1; else select avg(list_price) into v_avgListPrice from books where topic_id = p_subject group by topic_id; end if; return v_avgPrice; end$$ delimiter ; 语句的结尾。