2017-04-11 33 views
0

我需要一個相當於SQL Server函數convert的Postgres函數。最後我寫一個函數相當於SQL Server功能的Postgresql轉換

CREATE OR REPLACE FUNCTION convert (target VARCHAR(50),source ANYELEMENT,style INT) RETURNS ANYELEMENT 
    AS 
    $$ BEGIN 
    CASE 
    when style=0 then CASE 
    WHEN target ='int' THEN return source::int; 
    WHEN target ='smallint' or target = 'tinyint' THEN return source::smallint; 
    WHEN target ='bigint' THEN return source::bigint; 
    WHEN target ='numeric' or target = 'real' or target = 'float' THEN return source::double precision; 
    WHEN target ='smallmoney' or target = 'money' or target = 'decimal' THEN return source::double precision; 
    WHEN target ='char' THEN return source::char; 
    WHEN target ='datetime' or target = 'smalldatetime' then return source::timestamp; 
    WHEN target like 'varchar%' or target like 'nvarchar%' THEN return source::varchar; 
    WHEN target = 'text' or target like 'ntext' THEN return source::text; 
    WHEN target = 'timestamp' THEN return source::varchar(30); 
    WHEN target = 'binary' or target='varbinary' THEN return source::bytea; 
    WHEN target = 'uniqueidentifier' THEN return source::varchar(37); 
    WHEN target = 'sysname' THEN return source::varchar(128); 
    WHEN target = 'sql_variant' THEN return varchar; 
    WHEN target = 'bit' THEN if source::varchar='1' THEN return true; ELSIF source::varchar='0' THEN return false; else RAISE EXCEPTION 'Invalid value for Input boolean'; END IF; 
    ELSE return source::anyelement; 
END CASE; 
    when style!=0 then CASE 
    WHEN (style = 0 OR style = 100) THEN return to_timestamp(source::text,'mon dd yyyy hh:miAM'); 
     WHEN style = 1 THEN return to_timestamp(source::text,'mm/dd/yy'); 
     WHEN style = 101 THEN return to_timestamp(source::text,'mm/dd/yyyy'); 
     .. 
    .. 
END CASE; 
END CASE; 
    END; 
$$ LANGUAGE plpgsql; 

當調用該函數爲select convert('int','1',0),它引發以下錯誤:

"ERROR: could not determine polymorphic type because input has type "unknown" 1 statement failed."

當我做第二個參數轉換(「詮釋」的顯式轉換,」 1':: text,0),它的工作原理。但是我需要打電話,不要做任何額外的演員。有人可以幫忙嗎?

+1

什麼是MS-SQL Server的'convert'功能,你試圖複製,爲什麼你需要它? –

+2

爲什麼不在必要時使用帶'to_char' /'to_timestamp'的'CAST'? - 你想要的將永遠不會在PostgreSQL上工作,因爲文字'1'具有[未知](https://www.postgresql.org/message-id/183.1302200970%40sss.pgh.pa.us)類型。你總是需要提供類型信息;無論是在類型化的文字語法'int'1''中,還是使用強制轉換''1':: int'或'CAST('1'as int)'。如果您使用準備好的語句並通過綁定提供類型信息(無論如何您都應該這樣做),您不必使用強制轉換。 – pozs

回答

0

如果PostgreSQL解析器沒有改變,你不能編寫像convert這樣的函數。改用PostgreSQL cast函數。 anyelement就像模板 - 如果輸入anyelementint,那麼輸出上的anyelement也將是int。這不是你想要的。

PostgreSQL不允許在函數內部選擇​​結果類型時寫入任何函數。在調用函數之前應該知道結果類型。而且因爲PostgreSQL對你的函數一無所知,所以不能根據需要選擇結果類型。