postgresql - 如何在CREATE TYPE中使用原始Postgres input/output_function?

标签 postgresql type-conversion sqldatatypes

我有一个包含 smallint 类型列的表,并且想要提供从 varcharsmallintCAST > 仅为该列实现一些转换。因此,为了能够根据我的需要创建特定的 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/

相关文章:

postgresql - 无法使用 gorm Postgresql 设置外键

sql - 按日期和按类型混合排序

postgresql - 使用 postgres ltree 查询对 ~ 运算符进行 Sequelize 支持

c# - 动态添加范围到列表

python - 在Python中将字符串转换为int,只有没有字符的数字

sql - 当我知道值不会超过 255 时,设置 tinyint 字段是否有优势?

sql - 每个不同值中选择 5 个

angular - 在哪里可以找到我的 Angular 2 CLI TypeScript 错误?

mysql - 在表中存储非数字注册号的数据类型

sql-server - 为什么 SUM(real) 在 SQL Server 中返回 float 数据类型?