PostgreSQL DBA(136)——发展(常见错误)

  

本节简单介绍了在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

PostgreSQL DBA(136)——发展(常见错误)