我打开一个SQL Client,然后键入以下MySQL语句。
use green;
delimiter $
drop function if exists tstFunction $
create function tstFunction(cnt int) returns int
begin
case when 1 > cnt then set @a1 := 1;
when 5 > cnt then set @a2 := 2;
when 4 > cnt then set @a3 := 3;
else set @a4 := 4;
end case;
return 0;
end $
delimiter ;
select tstFunction(3), @a1, @a2, @a3, @a4;我想测试的是CASE在复合语句时的执行流程。以上SELECT语句的查询结果如下:
tstFunction(3) @a1 @a2 @a3 @a4
0 NULL NULL NULL NULL我对@a2的价值感到困惑。为什么是NULL?为什么不使用2?
因此,我打开一个新的MySQL命令行客户端并重新构建tstFuncton,但将SELECT语句分成两行,如下所示:
select tstFunction(3);
select @a1, @a2, @a3, @a4;并且新的查询结果看起来很好:
@a1 @a2 @a3 @a4
NULL 2 NULL NULL第一种形式的SELECT语句发生了什么变化?为什么我需要把它分成两条SELECT语句?
发布于 2016-05-09 17:00:20
在MySQL中,声明局部变量与"set“语句一起使用。在您的第一个SELECT语句形式中,您已经直接编写了它们,所以为什么您会得到NULLS。
你可能会有一个问题,你已经在你的函数中声明了它们。但问题是,执行函数和打印变量都在单个SELECT语句中,这意味着它们将作为单个批处理执行。
在第二种形式中,当您在两个不同的批处理中运行这两个SELECT时,变量以函数的值声明。
如果您想让它们与您的第一种SELECT形式一起出现,那么就像这样在之前声明一个变量,
set @a2 = '';
select tstFunction(3), @a1, @a2, @a3, @a4;https://stackoverflow.com/questions/37109689
复制相似问题