Приведение к пользовательскому типу в запросе SELECT - PullRequest
0 голосов
/ 11 сентября 2018

Я новичок в PostgreSQL и абсолютно потерян здесь.(Угадай, даже название абсолютно неверное ...)

У меня есть, например, это:

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

Есть ли простой способ получить тот же результат, используя пользовательский тип:

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

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Я думаю, это зависит от типа. Например, у меня на 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)
0 голосов
/ 11 сентября 2018

Формально вы можете создать любой тип, используя этот упрощенный синтаксис:

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) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...