我有一个包含 smallint
类型列的表,并且想要提供从 varchar
到 smallint
的 CAST
> 仅为该列实现一些转换。因此,为了能够根据我的需要创建特定的 CAST
,我需要该特殊列的类型。已经尝试使用域,但 Postgres 警告那些在 CAST
中被忽略的内容...所以看起来我陷入了 CREATE TYPE
的困境,但我不这样做我想自己实现所需的 input/output_function,因为最后我只需要 Postgres 中 smallint
已经可用的任何内容。
问题是我不知道这些函数的名称,这些函数存储在哪个库中,如果我需要提供在不同操作系统上安装时可能会有所不同的路径,或者这些路径是否可用。
那么,是否可以CREATE TYPE
类似smallint
的东西,它完全只使用Postgres函数并且以独立于平台/路径的方式?
我没有发现有人做类似的事情。谢谢!
最佳答案
您可以创建一个类似于 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 .
我建议您寻找更简单的解决方案来解决您的问题,例如显式类型转换。
关于postgresql - 如何在CREATE TYPE中使用原始Postgres input/output_function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45188301/