Я ищу способ создать функцию icase()
, которая работает с любыми типами данных, совместимыми со вторым и третьим параметром.
Я пробовал в Postgres 9.4:
CREATE OR REPLACE FUNCTION public.icase(
cond1 boolean,
res1 anyelement,
conddefault anyelement)
RETURNS anyelement AS
' SELECT CASE WHEN $1 THEN $2 ELSE $3 END; '
LANGUAGE sql IMMUTABLE;
Но:
select icase( true, 1.0, 0 )
вызывает ошибку:
ERROR: function icase(boolean, numeric, integer) does not exist LINE 9: select icase( true, 1.0, 0 ) ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Как исправить это в 9.1+, чтобы второй и третий аргументы могли быть как целыми, так и числовыми?
Этот метод может быть вызван, если второй и третий параметры имеют типы text
, char(n)
, date
, numeric
или int
.
anyelement
разрешается только для одного типа данных для каждой функции, а не для каждого использования. Даже если вы избегалиanyelement
и использовали жестко закодированные типы данных, вы не сможете написать функцию, которая возвращает числовое или целочисленное значение. Вы должны выбрать по одному для каждой функции. Я предполагаю, что если вы измените вызов функции наselect icase(true, 1.0, 0.0)
, он будет работать так, как задумано. - person Shawn   schedule 20.05.2015int
или обаnumeric
или оба дата и т. д.? Ваш заголовок и пример намекают в другом направлении, чем ваше окончательное утверждение ... Кроме того, вам нужно, чтобы результат имел точно такой же тип данных или представлениеtext
выполняло бы эту работу? - person Erwin Brandstetter   schedule 22.05.2015(int,numeric), (numeric,int), (int,int), (numeric,numeric), (date,date), (char(n) , char(n)), (text, char(n)), (char(n), text), (text,text)
Для смешанных числовых/целочисленных параметров результат всегда может быть числовым. Для не смешанных параметров результат должен совпадать с типом параметра. Для числовых параметров и параметров даты текстовый результат, вероятно, не может быть возвращен, поскольку он используется в выражении, и prostgres, вероятно, выдаст ошибку, если текст используется в числовом выражении, автоматическое приведение, вероятно, больше не поддерживается в 9.1+ - person Andrus   schedule 22.05.2015