以上是去美国留学的一个同事的问题,如上所说,自己尝试使用sql变量的方式解决了一下:
select tt.result from
(
select pos,
case
when type = 'val' then if (@var1=0, @var1:=op, @var2:=op)
when type = 'op' and op = '+' then (@var1 := @var1+@var2) | (@var2 := 0)
when type = 'op' and op = '-' then (@var1 := @var1-@var2) | (@var2 := 0)
when type = 'op' and op = '*' then (@var1 := @var1*@var2) | (@var2 := 0)
when type = 'op' and op = '/' then (@var1 := @var1/@var2) | (@var2 := 0)
end result
from stack t , (select(@var1:=0)) b, (select(@var2:=0)) c order by t.pos desc
) as tt where tt.pos = 0
经过真实环境测试,完全可用。
具体原理:
1. 后面跟的select 为了给 @num1, @num2 设置初始值, 这个sql只适用于二值累进计算
2. 开始赋值时,分别判断给 @num1, @num2不为0的数进行赋值,不适用开始两个数有0的情况
3. 每步计算完成后,@num1 存储计算结果,@num2清零, | 为了既可以对@num2清零又不污染结果