PostgreSQL在进行除法时要注意

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,企业版 4核16GB
推荐场景:
HTAP混合负载
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: PostgreSQL在进行除法时要注意

背景

整型除以整型,正常情况下当然得到的应该也是整型。数据库也是这么干的。

但是在数据库应用中,通常业务的需求是得到NUMERIC,不能直接把小数干掉。

数据库的行为给用户带来了诸多不便,例如1除以2,如果是整型除法会得到0,然而用户可能要的是0.5。

那么怎么处理呢?

1、建议用户使用float8, money, numeric来存储这种数值。

2、或者在除法时,对操作数进行转换。

操作符

postgres=# \do+ /  
                                                     List of operators  
   Schema   | Name |  Left arg type   |  Right arg type  |   Result type    |   Function    |         Description            
------------+------+------------------+------------------+------------------+---------------+------------------------------  
 pg_catalog | /    | bigint           | bigint           | bigint           | int8div       | divide  
 pg_catalog | /    | bigint           | integer          | bigint           | int84div      | divide  
 pg_catalog | /    | bigint           | smallint         | bigint           | int82div      | divide  
 pg_catalog | /    | box              | point            | box              | box_div       | divide box by point (scale)  
 pg_catalog | /    | circle           | point            | circle           | circle_div_pt | divide  
 pg_catalog | /    | double precision | double precision | double precision | float8div     | divide  
 pg_catalog | /    | double precision | real             | double precision | float84div    | divide  
 pg_catalog | /    | integer          | bigint           | bigint           | int48div      | divide  
 pg_catalog | /    | integer          | integer          | integer          | int4div       | divide  
 pg_catalog | /    | integer          | smallint         | integer          | int42div      | divide  
 pg_catalog | /    | interval         | double precision | interval         | interval_div  | divide  
 pg_catalog | /    | money            | bigint           | money            | cash_div_int8 | divide  
 pg_catalog | /    | money            | double precision | money            | cash_div_flt8 | divide  
 pg_catalog | /    | money            | integer          | money            | cash_div_int4 | divide  
 pg_catalog | /    | money            | money            | double precision | cash_div_cash | divide  
 pg_catalog | /    | money            | real             | money            | cash_div_flt4 | divide  
 pg_catalog | /    | money            | smallint         | money            | cash_div_int2 | divide  
 pg_catalog | /    | numeric          | numeric          | numeric          | numeric_div   | divide  
 pg_catalog | /    | path             | point            | path             | path_div_pt   | divide (rotate/scale path)  
 pg_catalog | /    | point            | point            | point            | point_div     | divide points (scale/rotate)  
 pg_catalog | /    | real             | double precision | double precision | float48div    | divide  
 pg_catalog | /    | real             | real             | real             | float4div     | divide  
 pg_catalog | /    | smallint         | bigint           | bigint           | int28div      | divide  
 pg_catalog | /    | smallint         | integer          | integer          | int24div      | divide  
 pg_catalog | /    | smallint         | smallint         | smallint         | int2div       | divide  
(25 rows)

显示转换

int 转成 numeric或者float8后再除。

例子

postgres=# select 1/2;  
 ?column?   
----------  
        0  
(1 row)  
显示转换任意操作数
postgres=# select 1/2.0;  
 ?column?   
----------  
      0.5  
(1 row)  
postgres=# select 1/2::float8;  
 ?column?   
----------  
      0.5  
(1 row)  
postgres=# select 1/2::numeric;  
        ?column?          
------------------------  
 0.50000000000000000000  
(1 row)

本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。


相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
移动开发 关系型数据库 PostgreSQL
PostgreSQL 条件判断函数
PostgreSQL 条件判断函数
809 1
|
12月前
|
JSON 关系型数据库 PostgreSQL
postgresql中的@> 是什么运算符?
如果在一个数组列中想查询包含有某个字符换的时候就不能用like 了吧?
83 0
|
存储 SQL 安全
第四章《MySQL的数据类型和运算符》
第四章《MySQL的数据类型和运算符》
第四章《MySQL的数据类型和运算符》
|
存储 关系型数据库 PostgreSQL
PostgreSQL 整数类型
PostgreSQL 整数类型
275 0
|
关系型数据库 PostgreSQL
PostgreSQL 算术运算符
PostgreSQL 算术运算符
114 0
|
关系型数据库 MySQL
MySQL练习14——操作符混合运用
MySQL练习14——操作符混合运用!
|
存储 安全 关系型数据库
MySQL的数值类型最佳实践
MySQL的数值类型最佳实践
185 0
|
关系型数据库 分布式数据库
PolarDB-X 1.0-SQL 手册-运算符-赋值运算符
DRDS 支持 ‘=’ 赋值运算符,一般在 UPDATE 的 SET 部分出现。
116 0
|
SQL 关系型数据库 MySQL
PolarDB-X 1.0-SQL 手册-运算符-运算符优先级
PolarDB-X 中操作符的优先级由高到低,如下所示:
123 0
|
关系型数据库 MySQL
PolarDB-X 1.0-SQL 手册-数据类型-数值类型
数值类型按精确度可以划分为如下两类:
237 0