Формально вы можете создать любой тип, используя этот упрощенный синтаксис:
CREATE TYPE my_numeric (
INPUT = my_numeric_in,
OUTPUT = my_numeric_out,
<optional parameters>
)
, где my_numeric_in
и my_numeric_out
- функции поддержки. Проблема в том, что
Как правило, эти функции должны быть написаны на C или другом языке низкого уровня.
Это означает, что это своего рода расширение Postgres, и вам нужно скомпилировать сервер или расширение с кодом функций, так что это определенно не простой способ. На практике такого рода входные преобразования могут быть выполнены с использованием триггеров, однако описанное преобразование выглядит странно и может считаться плохой практикой.
У вас может возникнуть желание определить свой тип как домен и создать соответствующий тип , но это не будет работать:
Приведение к типу домена или из него в настоящее время не имеет никакого эффекта. Приведение к домену или из него использует приведения, связанные с его базовым типом.
Самый простой способ достижения аналогичного эффекта - сохранить значение как 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)