我打开一个MySQL命令行客户端,输入以下SQL语句。
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 WHEN复合语句的执行流程。上述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
语句?
答案 0 :(得分:0)
在MySQL中,声明局部变量与“set”语句一致。在你的第一种形式的SELECT语句中,你已经直接写了它们,所以你为什么要获得NULLS。
您可能有一个问题,您已经在函数中声明了它们。但事实是,执行函数和打印变量都在一个SELECT语句中,这意味着它们作为一个批处理执行。
在第二种形式中,当您在两个不同的批次中运行两个SELECT时,变量将使用函数中的值声明。
如果你想让他们使用你的第一种形式的SELECT,那么在这之前声明一个变量,
set @a2 = '';
select tstFunction(3), @a1, @a2, @a3, @a4;