Postgresql等效于SQL Server函数Convert

时间:2017-04-11 05:57:52

标签: sql postgresql plpgsql sql-convert

我需要一个Postgres函数,它等同于SQL Server函数convert。我最后写了一个函数

    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)时,会抛出以下错误:

  

"错误:无法确定多态类型,因为输入类型为"未知" 1声明失败。"

当我将第二个参数显式转换为转换(' int',' 1' :: text,0)时,它可以正常工作。但是我需要在不做任何额外演员的情况下打电话。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

如果没有PostgreSQL解析器中的更改,您不能编写convert之类的函数。请改用PostgreSQL cast函数。 anyelement就像模板一样 - 如果输入中的anyelementint,则输出中的anyelement也将为int。这不是你想要的。

当在函数内部选择​​结果类型时,PostgreSQL不允许写任何函数。在调用函数之前,应该知道结果类型。而且因为PostgreSQL对你的函数一无所知,所以不能像你需要的那样选择结果类型。