如何在CREATE TYPE中使用原始的Postgres输入/输出函数?

时间:2017-07-19 10:48:15

标签: postgresql type-conversion sqldatatypes

我有一个包含smallint类型列的表,并希望从CASTvarchar提供smallint,以便仅为该列实现一些转换。因此,为了能够根据我的需要创建特定的CAST,我需要一个特殊列的类型。已经尝试使用域名,但Postgres警告CAST中被忽略的内容......所以我看起来好像被CREATE TYPE所困,但我不想实施我自己需要输入/输出函数,因为最后我只需要Postgres中smallint已有的任何内容。

问题是我不知道这些函数的名称,其中存储了lib,如果我需要提供在不同操作系统上安装时可能会有所不同的路径,或者根本不可用。

那么,CREATE TYPE是否有可能完全只使用Postgres函数并且以平台/路径无关的方式使用smallint之类的东西?

我没有发现有人这样做过。谢谢!

1 个答案:

答案 0 :(得分:0)

您可以像这样创建一个类似smallint的类型:

CREATE TYPE myint;

CREATE FUNCTION myintin(cstring) RETURNS myint
   LANGUAGE internal IMMUTABLE STRICT PARALLEL SAFE AS 'int2in';

CREATE FUNCTION myintout(myint) RETURNS cstring
   LANGUAGE internal IMMUTABLE STRICT PARALLEL SAFE AS 'int2out';

CREATE FUNCTION myintrecv(internal) RETURNS myint
   LANGUAGE internal IMMUTABLE STRICT PARALLEL SAFE AS 'int2recv';

CREATE FUNCTION myintsend(myint) RETURNS bytea
   LANGUAGE internal IMMUTABLE STRICT PARALLEL SAFE AS 'int2send';

CREATE TYPE myint (
   INPUT = myintin,
   OUTPUT = myintout,
   RECEIVE = myintrecv,
   SEND = myintsend,
   LIKE = smallint,
   CATEGORY = 'N',
   PREFERRED = FALSE,
   DELIMITER = ',',
   COLLATABLE = FALSE
);

如果要在算术表达式中使用强制转换,则必须将强制转换定义为其他数值类型。

如果您还添加来自varchar(或text)的强制转型,但请注意,在类型解析过程中创建过多的强制转换会导致歧义和令人惊讶的行为。这就是为什么在PostgreSQL 8.3中删除了许多类型转换的原因,请参阅release notes

我建议您寻找一个更简单的问题解决方案,例如显式类型转换。