2015-06-12 49 views
4

當我試圖text值轉換爲timestamp值返回空值。 對於下面的表稱爲a的Postgres的功能錯誤/失敗鑄造

id |   c1 
----+-------------------- 
    1 | 03-03-2000 
    2 | 01-01-2000 
    3 | 12/4/1990 
    4 | 12 Sept 2011 
    5 | 12-1-1999 12:33:12 
    6 | 24-04-89 2:33 am 

我試圖執行與一個select如下:

select id, c1,c1::timestampas c2 from a;

這正常工作,如果有隻有第5排,但第6排c124-04-89 2:33 am它引發以下錯誤:

ERROR: date/time field value out of range: "24-04-89 2:33 am"
HINT: Perhaps you need a different "datestyle" setting.

我要的是null對於不能沒有鑄造而不是時間戳命令完全失敗的那些值。就像這樣:

id |   c1   |   c2 
----+--------------------+--------------------- 
    1 | 03-03-2000   | 2000-03-03 00:00:00 
    2 | 01-01-2000   | 2000-01-01 00:00:00 
    3 | 12/4/1990   | 1990-12-04 00:00:00 
    4 | 12 Sept 2011  | 2011-09-12 00:00:00 
    5 | 12-1-1999 12:33:12 | 1999-12-01 12:33:12 
    6 | 24-04-89 2:33 am | (null) 
(6 rows) 

編輯:
此外,有沒有實現這一個通用的方法?即:(基於klin's answer)一個PLPGSQL包裝函數,其設定值,以null如果纏繞功能引發錯誤。 對於例如:一個功能set_null_on_error可以像這樣使用:

select id, c1,set_null_on_error(c1::timestamp)as c2 from a;

select id, c1,set_null_on_error(to_number(c1, '99'))as c2 from a;

回答

3

這可通過捕獲在一個異常進行一個plpgsql函數。

create or replace function my_to_timestamp(arg text) 
returns timestamp language plpgsql 
as $$ 
begin 
    begin 
     return arg::timestamp; 
    exception when others then 
     return null; 
    end; 
end $$; 

select id, c1, my_to_timestamp(c1) as c2 from a; 

試圖定義一個通用功能

假設你定義的函數set_null_on_error(anyelement)。調用

select set_null_on_error('foo'::timestamp); 

提高執行函數之前錯誤

你可以嘗試這樣的事情:

create or replace function set_null_on_error(kind text, args anyarray) 
returns anyelement language plpgsql 
as $$ 
begin 
    begin 
     if kind = 'timestamp' then 
      return args[1]::timestamp; 
     elseif kind = 'number' then 
      return to_number(args[1], args[2]); 
     end if; 
    exception when others then 
     return null; 
    end; 
end; $$; 

select set_null_on_error('timestamp', array['2014-01-01']); 
select set_null_on_error('number', array['1.22444', '9999D99']); 

在我看來這樣的解決方案過於複雜,非常不方便使用,一般可能會變成難以產生的問題進行調試。

+0

除了編寫plpgsql函數之外,還有其他方法嗎? –

+1

我不這麼認爲。但上帝給了我們plpgsql來使用它。 – klin

+0

你可以看看問題中的編輯部分,讓我們知道這是否可以實現? –