我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PostgreSQL DBA(136) - Develop(Common Mistakes)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PostgreSQL DBA(136) - Develop(Common Mistakes)

本节简单介绍了在PostgreSQL中容易出错但又容易被忽略的细节。

除法运算
在整数和整数之间执行除法运算时,结果会是整数,但实际上我们希望保留小数位。


[local:/data/pg12]:5432 pg12@testdb=# select 1/2;
 ?column? 
----------
        0
(1 row)
[local:/data/pg12]:5432 pg12@testdb=#

查询操作符”/“的定义


[local:/data/pg12]:5432 pg12@testdb=# select oprname,oprleft::regtype,oprright::regtype,oprresult::regtype from pg_operator where oprname = '/';
 oprname |     oprleft      |     oprright     |    oprresult     
---------+------------------+------------------+------------------
 /       | smallint         | smallint         | smallint
 /       | integer          | integer          | integer
 /       | smallint         | integer          | integer
 /       | integer          | smallint         | integer
 /       | real             | real             | real
 /       | double precision | double precision | double precision
 /       | bigint           | bigint           | bigint
 /       | bigint           | integer          | bigint
 /       | integer          | bigint           | bigint
 /       | bigint           | smallint         | bigint
 /       | smallint         | bigint           | bigint
 /       | point            | point            | point
 /       | path             | point            | path
 /       | box              | point            | box
 /       | money            | real             | money
 /       | money            | double precision | money
 /       | money            | bigint           | money
 /       | money            | integer          | money
 /       | money            | smallint         | money
 /       | money            | money            | double precision
 /       | real             | double precision | double precision
 /       | double precision | real             | double precision
 /       | circle           | point            | circle
 /       | interval         | double precision | interval
 /       | numeric          | numeric          | numeric
(25 rows)
[local:/data/pg12]:5432 pg12@testdb=#

在PG中,整型之间的除法得到的结果为整型,如结果需要得到浮点数或实数,则需要执行类型转换,比如把其中一个算子转换为float或者numeric


[local:/data/pg12]:5432 pg12@testdb=# select 1/2::float;
 ?column? 
----------
      0.5
(1 row)
[local:/data/pg12]:5432 pg12@testdb=# select 1/2::numeric;
        ?column?        
------------------------
 0.50000000000000000000
(1 row)
[local:/data/pg12]:5432 pg12@testdb=#

被0除错误
如除数为0时,会报“ERROR: division by zero”错误,为免出现这种错误,可使用nullif判断除数是否为0,如为0则返回null


[local:/data/pg12]:5432 pg12@testdb=# select 1/0;
ERROR:  division by zero
[local:/data/pg12]:5432 pg12@testdb=# select 1/nullif(0,0);
 ?column? 
----------
(1 row)
[local:/data/pg12]:5432 pg12@testdb=# select 1/nullif(0,0) is null;
 ?column? 
----------
 t
(1 row)
[local:/data/pg12]:5432 pg12@testdb=#

统计NULL值问题
如使用count(column)时,column的值如为null则不会统计到结果中,使用count(*)则会统计。


[local:/data/pg12]:5432 pg12@testdb=# create table t_count(id int);
CREATE TABLE
[local:/data/pg12]:5432 pg12@testdb=# insert into t_count select generate_series(1,1000);
INSERT 0 1000
[local:/data/pg12]:5432 pg12@testdb=# insert into t_count select null from generate_series(1,1000);
INSERT 0 1000
[local:/data/pg12]:5432 pg12@testdb=# select count(*) from t_count;
 count 
-------
  2000
(1 row)
[local:/data/pg12]:5432 pg12@testdb=# select count(id) from t_count;
 count 
-------
  1000
(1 row)
[local:/data/pg12]:5432 pg12@testdb=#

参考资料
https://hakibenita.com/sql-dos-and-donts

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PostgreSQL DBA(136) - Develop(Common Mistakes)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

目录