本节简单介绍了在PostgreSQL中容易出错但又容易被忽略的细节。
<强>除法运算强>
在整数和整数之间执行除法运算时,结果会是整数,但实际上我们希望保留小数位。
<前>
<代码>[当地:/数据/pg12]: 5432 pg12@testdb=#选择1/2;
列?
----------
0
(1行)
(本地/数据/pg12]: 5432 pg12@testdb=#
代码>
查询操作符“/钡亩ㄒ?/p> <前> <代码>[当地:/数据/pg12]: 5432 pg12@testdb=#选择oprname oprleft: regtype oprright:: regtype oprresult::从pg_operator regtype oprname='/'; oprname | oprleft | oprright | oprresult - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - -/| smallint | smallint |短整型/| |整数|整数的整数/| smallint | |整数的整数/|整数| smallint |整数/|真正的| |真实/|双精度|双精度|双精度/| bigint | bigint | bigint/| bigint |整数| bigint/|整数| bigint | bigint/| bigint | smallint | bigint/| smallint | bigint | bigint/| |点|点/| | |路径点的路径/|框| |点框/| |的|钱/| | |双精度钱 钱/| | bigint |钱/| | |整数钱/| | smallint |钱 钱/| | |双精度/|的|双精度|双精度/|双精度| |双精度 圆/| | |圆/|间隔|双精度|间隔/|数字|数字|数字 (25行) (本地/数据/pg12]: 5432 pg12@testdb=# 代码>
在PG中,整型之间的除法得到的结果为整型,如结果需要得到浮点数或实数,则需要执行类型转换,比如把其中一个算子转换为浮动或者数字
<前> <代码>[当地:/数据/pg12]: 5432 pg12@testdb=#选择1/2::浮动; 列? ---------- 0.5 (1行) (本地/数据/pg12]: 5432 pg12@testdb=#选择1/2::数字; 列? ------------------------ 0.50000000000000000000 (1行) (本地/数据/pg12]: 5432 pg12@testdb=# 代码>
<强>被0除错误强>
如除数为0时,会报“错误:除零”错误,为免出现这种错误,可使用nullif判断除数是否为0,如为0则返回零
<前>
<代码>[当地:/数据/pg12]: 5432 pg12@testdb=#选择1/0;
错误:除零
(本地/数据/pg12]: 5432 pg12@testdb=#选择1/nullif (0,0);
列?
----------
(1行)
(本地/数据/pg12]: 5432 pg12@testdb=#选择1/nullif(0,0)为空;
列?
----------
t
(1行)
(本地/数据/pg12]: 5432 pg12@testdb=#
代码>
<强>统计零值问题强>
如使用计数(列)时,列的值如为空则不会统计到结果中,使用count(*)则会统计。
<前>
<代码>[当地:/数据/pg12]: 5432 pg12@testdb=#创建表t_count (int id);
创建表
(本地/数据/pg12]: 5432 pg12@testdb=#插入t_count选择generate_series (1000);
插入0 1000
(本地/数据/pg12]: 5432 pg12@testdb=#插入t_count从generate_series选择空(1000);
插入0 1000
(本地/数据/pg12]: 5432 pg12@testdb=#从t_count选择count (*);
数
-------
2000
(1行)
(本地/数据/pg12]: 5432 pg12@testdb=#从t_count选择计数(id);
数
-------
1000
(1行)
(本地/数据/pg12]: 5432 pg12@testdb=#
代码>
<强>参考资料强>
https://hakibenita.com/sql-dos-and-donts