有一个SQL调用由两个通用部分组成。第一个是有效的,而第二个是注释掉
select(2200 +
600 *
round(abs(sin(((1) * 0.042))) + 0.1) *
(sin(sin(((1) * 2 / 2 / 2.155172413793103 * PI()))) /
abs(sin(sin(((1) * 2 / 2 / 2.155172413793103* PI()))))) * --here is the division
(3 - exp(-12.5 + floor((1) * 2 / 2 / 2.155172413793103) * 2.155172413793103 * PI() * 2 * round(abs(sin(((1) * 0.042))) + 0.1) - (1 * 2 * PI())))
+
--600 *
-- abs(round(abs(sin(((1) * 0.042))) + 0.1) - 1) *
-- (sin(sin(((1) / 2 / 4.310344827586207 * PI()))) /
-- abs(sin(sin(((1) / 2 / 4.310344827586207 * PI()))))) * --here is the second division that causes the rpoblem
-- (3 - exp(-25.5 + floor((1) / 2 / 4.310344827586207) * 4.310344827586207 * PI() * 2 * abs(round(abs(sin(((1) * 0.042))) + 0.1) - 1) - (1 * PI())))
+50 * sin(3 + 1 * 0.092) + 350 * sin(3 + 1 * 0.012));
所以,问题是为什么
RROR: division by zero
********** Error **********
ERROR: division by zero
SQL state: 22012
只有当第二部分被注释掉时,才会出现错误。发生分裂的部分都是一样的:
abs(sin(sin(((1) * 2 / 2 / 2.155172413793103 * PI()))))) *
与
abs(sin(sin(((1) / 2 / 4.310344827586207 * PI()))))) *
它们都应该为零,或者为零。但只有第二个能把除法降到零。
这里的根本原因是什么?在第二种状态下,我能避免吗?有没有一种类型的cas,或者其他什么?
这是因为整数除法和浮点(十进制(除法的行为不同。
遵循BODMAS规则:
例1:
- (1(*2/2/2.15 5172413793103
- 1*2/2/22.155172413793103
- 1*1/2.155172413793103
- 1*0.464
- 0.464
例如2:
- (1(/2/4.310344827586207
- 4.310344827586207年1月2日
- 0/4.310344827586207
- 0
因此,1/2=0(整数除法(和1/2.0=0.5(浮动分割(
即使更正了此错误,表达式也会返回不同的结果,因为后面跟有机器的BODMAS优先级顺序(除法、乘法、加法、减法的括号(。