postgresql 我需要使用哪种数据类型在SQL中存储0到1到2个小数点之间的值

njthzxwz  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(389)

我需要在名为value的表中添加一列,该列需要存储0到1之间的值,最多保留2个小数点,即0.25 0.50 0.75 0.80等。
有谁能帮忙吗?先谢谢了

4xrmg8kj

4xrmg8kj1#

假设您指定的范围包含两个界限,请使用decimal(3,2)或numeric(3,2)。加入CHECK条件约束以拒绝负数。Online demo

create table test (
  yournum numeric(3,2),
  check (yournum between 0 and 1));

测试(注意舍入行为):

insert into test values
  (-0.0049),
  (-0.001),
  (0),
  (0.001),
  (0.2),
  (0.201),
  (0.234),
  (0.2345),
  (0.2349),
  (0.235),
  (0.239),
  (1),
  (1.001),
  (1.0049)
returning *;
-- yournum
-----------
--    0.00
--    0.00
--    0.00
--    0.00
--    0.20
--    0.20
--    0.23
--    0.23
--    0.23
--    0.24
--    0.24
--    1.00
--    1.00
--    1.00
--(14 rows)
--INSERT 0 14

拒收示例:

insert into test values (-0.005) returning *;
--ERROR:  new row for relation "test" violates check constraint "test_yournum_check"
--DETAIL:  Failing row contains (-0.01).
insert into test values (1.005) returning *;
--ERROR:  new row for relation "test" violates check constraint "test_yournum_check"
--DETAIL:  Failing row contains (1.01).
insert into test values (11) returning *;
--ERROR:  numeric field overflow
--DETAIL:  A field with precision 3, scale 2 must round to an absolute value less than 10^1.
insert into test values ('Infinity'::float) returning *;
--ERROR:  numeric field overflow
--DETAIL:  A field with precision 3, scale 2 cannot hold an infinite value.
insert into test values ('NaN'::float) returning *;
--ERROR:  new row for relation "test" violates check constraint "test_yournum_check"
--DETAIL:  Failing row contains (NaN).
x8goxv8g

x8goxv8g2#

我个人会使用smallint和,存储乘以100的值,并添加一个检查约束,以确保该值在0和100之间。这将最小化存储空间,并使计算更快。
当然,不利的一面是你的一些计算必须改变。加法很简单,但你必须在两个数相乘后除以100。

相关问题