PostgreSQL中的整除截断
2021-01-12 11:25 abce 阅读(685) 评论(0) 编辑 收藏 举报开发同学说,在自己的测试环境中,相同的数据和相同的sql,在mysql和pg中查询出来的结果却不同。问是不是他装的数据库有问题了或者sum函数用错了。
以下是测试数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | postgres=# select * from emp; empno | ename | job | mgr | hiredate | sal | comm | deptno -------+--------+-----------+------+------------+------+------+-------- 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800 | | 20 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | | 20 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 | 30 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850 | | 30 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450 | | 10 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 | 3000 | | 20 7839 | KING | PRESIDENT | | 1981-11-17 | 5000 | | 10 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 7876 | ADAMS | CLERK | 7788 | 1983-01-12 | 1100 | | 20 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950 | | 30 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | | 20 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300 | | 10 (14 rows ) postgres=# select ( sum ( case when deptno=10 then sal end )/ sum (sal))*100 as pct from emp; pct ----- 0 (1 row) postgres=# |
和
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | mysql> select * from emp; + -------+--------+-----------+------+------------+------+------+--------+ | EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO | + -------+--------+-----------+------+------------+------+------+--------+ | 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800 | NULL | 20 | | 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 | | 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 | | 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | NULL | 20 | | 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 | 30 | | 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850 | NULL | 30 | | 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450 | NULL | 10 | | 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 | 3000 | NULL | 20 | | 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000 | NULL | 10 | | 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 | | 7876 | ADAMS | CLERK | 7788 | 1983-01-12 | 1100 | NULL | 20 | | 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950 | NULL | 30 | | 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | NULL | 20 | | 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300 | NULL | 10 | + -------+--------+-----------+------+------------+------+------+--------+ 14 rows in set (0.00 sec) mysql> select ( sum ( case when deptno=10 then sal end )/ sum (sal))*100 as pct from emp; + ---------+ | pct | + ---------+ | 30.1464 | + ---------+ 1 row in set (0.00 sec) mysql> |
先看看mysql中对“/”的定义:
再看看pg中的定义:
此外,这里虽然不是sum()的问题,但是mysql和pg中,sum()的返回值也的确有所区别:
先看看mysql中对“sum”的定义:
再看看pg中的定义:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
2018-01-12 MySQL权限和用户安全
2018-01-12 mysql_config_editor
2017-01-12 oracle 12c jdbc连接pdb报错的问题
2017-01-12 设置log rotation避免tomcat catalina.out文件增长过大
2017-01-12 'Agent XPs' component is turned off as part of the security configuration for this server
2016-01-12 python笔记-print输出
2016-01-12 python笔记-列表和元组