【问题标题】:How to use original Postgres input/output_function in CREATE TYPE?如何在 CREATE TYPE 中使用原始 Postgres 输入/输出函数?
【发布时间】:2017-12-24 14:12:23
【问题描述】:

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

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

那么,CREATE TYPE 是否可以像 smallint 这样完全只使用 Postgres 函数并且以独立于平台/路径的方式?

我没有发现有人在做这样的事情。谢谢!

【问题讨论】:

    标签: postgresql type-conversion sqldatatypes


    【解决方案1】:

    您可以像这样创建一个类似于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

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

    【讨论】:

    • 我想创建一个有两个 bigint 的类型。返回一个 bigint,它是两个 bigint 的总和。
    • @Debjit 创意。当然可以通过编写 C 代码来完成(参见文档中的示例)。
    • 我们不能只使用没有 C 的 SQL 来做到这一点吗?
    • 绝对不是。
    猜你喜欢
    • 2011-08-10
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2019-05-16
    相关资源
    最近更新 更多