【问题标题】:Removing all the trailing zeroes of a numeric column in PostgreSQL删除 PostgreSQL 中数字列的所有尾随零
【发布时间】:2022-07-29 18:50:29
【问题描述】:

我有这个表属性,它有一个 NUMERIC(9,6) 类型的 atomic_mass 列:

 atomic_mass 
-------------
    1.008000
    4.002600
    6.940000
    9.012200
   10.810000
   12.011000
   14.007000
   15.999000
    1.000000
(9 rows)

所以我想删除列的所有尾随零,例如 1.008、4.0026 等。 所以我尝试执行以下操作

UPDATE properties SET atomic_mass=trim(trailing '0' from atomic_mass::text)::numeric;

但它不起作用。我测试了可以正常工作的修剪功能。如果我输入

SELECT trim(trailing '0' from atomic_mass::text)::numeric from properties

返回

rtrim  
--------
  1.008
 4.0026
   6.94
 9.0122
  10.81
 12.011
 14.007
 15.999
      1

我想要的专栏。那么我在这里做错了什么? 我正在使用 PostgreSQL 12.9。

【问题讨论】:

  • 这不是存储值的问题,而是您的 SQL 客户端(或应用程序)如何显示这些值

标签: postgresql


【解决方案1】:

您已将列定义为NUMERIC(9,6)。从这里Numeric typesNUMERIC(precision, scale),其中scale 是:

数字的小数位数是小数部分的小数位数,小数点右侧。

所以运行trim 来更新值不会有帮助,因为列定义scale 将覆盖它。尾随零是必须在输出时处理的格式问题。

更新

鉴于您的 cmets 中有关能够更改列类型的答案的信息:

create table numeric_test (num_fld numeric, num6_fld numeric(9,6));
nsert into numeric_test values (12.011000, 12.011000), (4.002600, 4.002600), (1.000000, 1.000000);

select * from numeric_test ;
  num_fld  | num6_fld  
-----------+-----------
 12.011000 | 12.011000
  4.002600 |  4.002600
  1.000000 |  1.000000

update numeric_test set num_fld = trim(trailing '0' from num_fld::text)::numeric, num6_fld = trim(trailing '0' from num6_fld::text)::numeric ;

select * from numeric_test ;
 num_fld | num6_fld  
---------+-----------
  12.011 | 12.011000
  4.0026 |  4.002600
       1 |  1.000000

--
insert into numeric_test values (9.012200, 9.012200);

select * from numeric_test ;
 num_fld  | num6_fld  
----------+-----------
   12.011 | 12.011000
   4.0026 |  4.002600
        1 |  1.000000
 9.012200 |  9.012200

使用不受约束的numeric,您可以在修剪它们的更新中从现有值中删除尾随零。但是,如果它们包含在不修剪它们的插入或更新中,您仍然会得到它们。

【讨论】:

  • 所以我应该先把它转换成十进制什么的?还是结果会一样?
  • decimalnumeric 是一回事。阅读我在答案中发布的链接中的信息,它将回答很多问题。
  • 实际上这是 freecodecamp 的 RDB 挑战的一部分,其中任务是“您应该从 atomic_mass 列的每一行中删除小数点后的所有尾随零。您可能需要将数据类型调整为 DECIMAL这个。注意不要改变值”。
  • 我通过使用命令“ALTER TABLE properties ALTER COLUMN atomic_mass TYPE REAL”将数据类型更改为 REAL 解决了这个问题
  • 查看我的UPDATE来回答。
【解决方案2】:

您不应将类型更改为 REAL,他们要求将其更改为 DECIMAL。因此,如果您仅将其更改为 DECIMAL 而不是 DECIMAL(9,6) 它将起作用。 这对我有用:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-30
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多