我需要创建一个函数,根据书籍主题给出平均书价。该功能的规则是:
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
有什么建议可以摆脱这个错误吗?有时我的语法有问题...提前谢谢。
答案 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 ;
语句的结尾。