Postgresql:在具有maltyped值的表中插入一些正确的默认值或NA?

时间:2017-10-22 21:37:49

标签: postgresql csv error-handling plpgsql

我有一个带浮动列的表。我想在其中插入一个malformatted / maltyped CSV,以便我将所有值转换为float,并且所有格式错误的值,触发错误,将得到一个零值。在speudo代码中,我正在寻找iserror(cast(newValue as float),0)

小工作示例

CSV看起来像这样

Ex1,Ex2,Ex3
1,2,hhh
1.2,1.0,1.9
a,2,3

创建表格并进行干净的复制

CREATE TABLE example
(
"Ex1" float,
"Ex2" float,
"Ex3" float
);

/*Copy with clean data*/
COPY example FROM '/tmp/test.csv' WITH CSV HEADER DELIMITER ',';

其中最后一个命令将触发错误,因为我们无法在表中插入非浮点值。

Error trapping可能有助于解决我的问题,但我不确定如何使用它来插入CSV

[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
EXCEPTION
    WHEN condition [ OR condition ... ] THEN
        handler_statements
    [ WHEN condition [ OR condition ... ] THEN
          handler_statements
      ... ]
END;

问题

  

如何在具有maltyped值的表中插入一些正确的默认值或NA?

1 个答案:

答案 0 :(得分:1)

在其他情况下,该功能也可能有用:

create or replace function to_float(text)
returns float language plpgsql as $$
begin
    return $1::float;
exception
    when invalid_text_representation then
        return 0::float;
end $$;

不幸的是,你不能在命令中使用里面的函数。你需要一个缓冲区,即一个临时表:

create temp table buffer (ex1 text, ex2 text, ex3 text);
copy buffer from '/tmp/test.csv' with csv header delimiter ',';

insert into example
select to_float(ex1), to_float(ex2), to_float(ex3)
from buffer;

drop table buffer;

最后:

select *
from example;

 Ex1 | Ex2 | Ex3 
-----+-----+-----
   1 |   2 |   0
 1.2 |   1 | 1.9
   0 |   2 |   3
(3 rows)