Приведение элемента к пользовательскому типу в функциях SQL в PostgreSQL - PullRequest
1 голос
/ 03 мая 2019

Скажем, у меня составной тип id_and_name.

CREATE TYPE id_and_name AS (id integer, name text);

Я хочу использовать эту структуру (id, name) в качестве параметра в функции, но я хочу, чтобы пользователю функции не приходилось приводить вручную:SELECT fun((1, 'name')::id_and_name);пользователь должен быть хорош с SELECT fun((1, 'name')).Это означает, что мой параметр функции будет anyelement или подобным, и я должен привести его к id_and_name в функции:

CREATE OR REPLACE FUNCTION fun(anyelement)
RETURNS id_and_name AS $$
    SELECT $1::id_and_name;
$$ LANGUAGE sql;

По какой-то причине SELECT fun((1, 'name')) выдает мне ошибку:

ERROR:  cannot cast type record to id_and_name
LINE 2:     SELECT $1::id_and_name;
                     ^

Хотя тот же запрос из функции с замещенным параметром работает нормально:

SELECT (1, 'name')::id_and_name;

Как мне выполнить такое приведение в функциях?

Я на PostgreSQL 10

1 Ответ

0 голосов
/ 03 мая 2019

Как уже упоминалось в комментариях, предпочтительно указывать аргумент.В противном случае вы можете использовать row_to_json для извлечения отдельных элементов записи и их приведения

CREATE OR REPLACE FUNCTION fun(anyelement)
RETURNS id_and_name AS $$
   SELECT (j->>'f1',j->>'f2')::id_and_name from row_to_json($1) as j;
$$ LANGUAGE sql;

DEMO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...