如何在 postgresql 的列中的所有行上应用翻译函数
How to apply Translate function on all rows within a column in postgresql
在我的数据集中,有一列包含数字,如 83.420
、43.317
、149.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'.
在我的数据集中,有一列包含数字,如 83.420
、43.317
、149.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'.