Postgresql 如何在创建类型中使用原始Postgres输入/输出函数?
我有一个表,其中有一些类型为Postgresql 如何在创建类型中使用原始Postgres输入/输出函数?,postgresql,type-conversion,sqldatatypes,Postgresql,Type Conversion,Sqldatatypes,我有一个表,其中有一些类型为smallint的列,我想提供一个CAST从varchar到smallint的转换,以便只对该列执行一些转换。因此,为了能够根据我的需要创建一个特定的CAST,我需要一个特殊列的类型。已尝试使用域,但Postgres警告在强制转换中忽略这些域。。。因此,看起来我一直在使用CREATE TYPE,但我不想自己实现所需的输入/输出函数,因为最终我只需要Postgres中的smallint应该已经可用的东西 问题是我不知道这些函数的名称,它们存储在哪个lib中,如果我需要提
smallint
的列,我想提供一个CAST
从varchar
到smallint
的转换,以便只对该列执行一些转换。因此,为了能够根据我的需要创建一个特定的CAST
,我需要一个特殊列的类型。已尝试使用域,但Postgres警告在强制转换中忽略这些域。。。因此,看起来我一直在使用CREATE TYPE
,但我不想自己实现所需的输入/输出函数,因为最终我只需要Postgres中的smallint
应该已经可用的东西
问题是我不知道这些函数的名称,它们存储在哪个lib中,如果我需要提供在不同操作系统上安装时可能不同的路径,或者这些路径是否可用
那么,是否有可能创建一种类似于smallint
的类型,它完全只使用Postgres函数,并且以平台/路径独立的方式使用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中删除了许多类型转换的原因,请参阅
我建议您为您的问题寻找更简单的解决方案,例如显式类型转换。我想创建一个具有两个bigint的类型。返回一个bigint,它是两个bigint的总和。@Debjit Creative。当然可以通过编写C代码来完成(参见文档中的示例)。我们不能只使用SQL而不使用C吗?绝对不行。