PostgreSQL在进行除法时要注意
背景
整型除以整型,正常情况下当然得到的应该也是整型。数据库也是这么干的。
但是在数据库应用中,通常业务的需求是得到NUMERIC,不能直接把小数干掉。
数据库的行为给用户带来了诸多不便,例如1除以2,如果是整型除法会得到0,然而用户可能要的是0.5。
那么怎么处理呢?
1、建议用户使用float8, money, numeric来存储这种数值。
2、或者在除法时,对操作数进行转换。
操作符
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 | 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后再除。
例子
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 | 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) |
本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。
出处:http://www.cnblogs.com/lingyejun/
若本文如对您有帮助,不妨点击一下右下角的【推荐】。
如果您喜欢或希望看到更多我的文章,可扫描二维码关注我的微信公众号《翎野君》。
转载文章请务必保留出处和署名,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!