我需要一个相当于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),它的工作原理。但是我需要打电话,不要做任何额外的演员。有人可以帮忙吗?
什么是MS-SQL Server的'convert'功能,你试图复制,为什么你需要它? –
为什么不在必要时使用带'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