在我擁有的資料集中,有一列包含諸如83.420, 43.317, 149.317, ... 之類的數字,并且該列存盤為字串。數字中的點不代表小數點,即數字83.420基本上是83420等。從本列中的數字中洗掉該點的一種方法是使用TRANSLATE如下函式:
SELECT translate('83.420', '.', '')
回傳83420. 但是我如何在資料集中的所有行上應用這個函式?我試過這個,但是,我失敗了:
SELECT translate(SELECT num_column FROM my_table, '.', '')
我面臨錯誤SQL Error [42601]: ERROR: syntax error at end of input。知道如何在資料的一列上完全應用翻譯功能嗎?或者有什么更好的主意可以使用而不是translate?
uj5u.com熱心網友回復:
您甚至可以將結果轉換為數字,如下所示:
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;
請注意,將數字存盤為格式化文本是一個(非常)糟糕的主意。請改用本機數字型別。
uj5u.com熱心網友回復:
兩種選擇。
設定表:
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”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/321570.html
標籤:PostgreSQL 翻译
