在SELECT查询中转换为自定义类型

时间:2018-09-11 19:15:47

标签: postgresql postgresql-9.6

我是PostgreSQL的新手,在这里绝对迷路了。 (猜想标题也绝对是错误的...)

我有这个:

postgres=# SELECT round(10000::decimal/100, 4);
  round   
----------
 100.0000
(1 row)

是否有一种使用自定义类型来获得相同结果的简单方法:

postgres=# SELECT 10000::my_type;
----------
 100.0000
(1 row)

2 个答案:

答案 0 :(得分:0)

形式上,您可以使用this simplified syntax:

创建任何类型
CREATE TYPE my_numeric (
    INPUT = my_numeric_in,
    OUTPUT = my_numeric_out,
    <optional parameters> 
    )

其中my_numeric_inmy_numeric_out是支持功能。问题是

  

通常,这些功能必须使用C或其他低级语言进行编码。

这意味着它是Postgres的一种扩展,您必须使用功能代码编译服务器或扩展,因此绝对不是一种简单的方法。实际上,可以使用触发器来完成这种输入转换,但是所描述的转换看起来很奇怪,可能被认为是不正确的做法。

您可能会想将您的类型定义为domaincreate appropriate cast,但这将不起作用:

  

强制转换为域类型或从域类型强制转换当前无效。向域或从域进行强制转换使用与其基础类型关联的强制转换。

达到类似效果的最简单方法是将值存储为numeric并使用转换函数,例如:

create or replace function my_numeric(numeric)
returns numeric language sql immutable as $$
    select round($1/100, 4)::numeric
$$;

select my_numeric(10000);

 my_numeric 
------------
   100.0000
(1 row) 

答案 1 :(得分:0)

我认为这取决于类型。 例如,以下内容适用于Postgres 9.3

# CREATE TYPE foo AS (num INT);
CREATE TYPE

# SELECT 300::foo;
ERROR:  cannot cast type integer to foo
LINE 1: SELECT 300::foo

# SELECT (ROW(300)::foo).num;
 num 
-----
 300
(1 row)