我不确定之前是否已经在S.O中回答过,但我找不到任何答案谷歌搜索在各种数据库中解释这种行为。所以我想我会在这里从专家那里澄清一下。
当我在Oracle,Postgresql,mysql和sql-server中运行此查询时,我得到了不同的结果。
Oracle 11g
select count(1/0) from dual;
ORA-01476:除数等于零
http://sqlfiddle.com/#!4/e0ee9e/751
SQL-Server 2017
select count(1/0) ;
1
但是select 1/0
会出错。
遇到零错误
http://sqlfiddle.com/#!18/2be41/2
http://sqlfiddle.com/#!18/185a6/7
PostgreSQL 9.6
错误:除以零
http://sqlfiddle.com/#!17/340e0/80
Mysql 5.6
select count(1/0) ;
0
http://sqlfiddle.com/#!9/2be41/10
为什么这些差异在实施中?
答案 0 :(得分:6)
ERROR_FOR_DIVISION_BY_ZERO
计算表达式的行数或非count()
值。
当表达式为常量时,它返回行数。
您所看到的是关于何时以及是否评估常量的问题,以及数据库处理这种情况的不同方式。
Oracle和Postgres显然正在尝试评估常量。说实话,我不确定这些是运行时错误还是编译错误。
SQL Server推迟评估直到需要 - 并且永远不需要它。因此,它计算行数。
MySQL很奇怪。它返回NULL
以进行除零。这不是标准行为,但也不完全不合理。 NULL
会返回COUNT(NULL)
。
答案 1 :(得分:5)
在mysql中有一个特定的模式(启用或禁用)
if(a_type == INT)
b.i = a.i;
if(a_type == FLOAT)
b.f = a.f;
管理这种情况,在你的情况下似乎 禁用(您应检查正确的模式值),因此您显然看到错误(或意外结果),但只是一个错误处理配置
https://dev.mysql.com/doc/refman/5.7/en/precision-math-expressions.html