如何在 postgresql 的列中的所有行上应用翻译函数

How to apply Translate function on all rows within a column in postgresql

在我的数据集中,有一列包含数字,如 83.42043.317149.317、...,并且此列存储为字符串。数字中的点不代表小数点,即数字 83.420 基本上是 83420 等。 从此列中的数字中删除此点的一种方法是使用 TRANSLATE 函数,如下所示:

SELECT translate('83.420', '.', '')

其中 returns 83420。但是我如何将这个函数应用于数据集中的所有行呢? 我试过了,但是失败了:

SELECT translate(SELECT num_column FROM my_table, '.', '')

我遇到错误 SQL Error [42601]: ERROR: syntax error at end of input。 知道如何将翻译功能完全应用于数据中的一列吗?或者有什么比 translate?

更好的主意

您甚至可以像这样将结果转换为数字:

SELECT translate(num_column, '.', '')::integer from the_table;
-- average:
SELECT avg(translate(num_column, '.', '')::integer from the_table;

或使用replace

SELECT replace(num_column, '.', '')::integer from the_table;
-- average:
SELECT avg(replace(num_column, '.', '')::integer) from the_table;

请注意,将数字存储为格式化文本是一个(非常)糟糕的主意。请改用本机数字类型。

两个选项。

设置table:

create table string_conv(id integer, num_column varchar);
insert into string_conv values (1, 83.420), (2, 43.317), (3, 149.317 );
select * from string_conv ;
 id | num_column 
----+------------
  1 | 83.420
  2 | 43.317
  3 | 149.317

第一个选项保留为字符串字段:

update string_conv set num_column = translate(num_column, '.', '');
 select * from string_conv ;
 id | num_column 
----+------------
  1 | 83420
  2 | 43317
  3 | 149317

以上更改了值格式。我的意思是,如果新数据以旧格式 'XX.XXX' 出现,则必须转换这些值。

第二个选项转换为整数列:

truncate string_conv ;
insert into string_conv values (1, 83.420), (2, 43.317), (3, 149.317 );
alter table string_conv alter COLUMN num_column type integer using translate(num_column, '.', '')::int;
select * from string_conv ;
 id | num_column 
----+------------
  1 |      83420
  2 |      43317
  3 |     149317
\d string_conv 
              Table "public.string_conv"
   Column   |  Type   | Collation | Nullable | Default 
------------+---------+-----------+----------+---------
 id         | integer |           |          | 
 num_column | integer |           |          | 


此选项更改值的格式并更改存储它们的列的类型。这里的问题是从那时起新值将需要与新类型兼容。这意味着将输入数据从 'XX.XXX' 更改为 'XXXXX'.