Функция SQL с переменным вводом varchar и переменным целочисленным выводом - PullRequest
0 голосов
/ 26 апреля 2018

Я знаю, что мог бы сделать следующее с внутренним объединением и выбором с таблицей соответствия, но скорее бы имел функцию.

Допустим, у меня есть запрос, например select * from foobar where is_valid in ('yes', 'no'). К сожалению, foobar.is_valid является целым числом, только 0 или 1.

Я хотел бы создать функцию, которая отображает varchar на целые числа, что-то вроде select * from foobar where is_valid in fn_yesno_to_int('yes', 'no'). Это вообще возможно?

Я не могу изменить предложение in на что-то другое, и я не могу вызывать функцию для каждого значения в предложении in (нет in (func('yes'), func('no'))).

Моим последним средством было бы создать таблицу соответствия, такую ​​как {{0, 'нет'}, {1, 'да'}}, и использовать ее, чтобы отказаться от использования функции. Другой, возможно, лучший вариант - перевернуть проблему и вызвать функцию на foobar.is_valid, сопоставляя 0,1 с нет, да; но мне очень любопытно узнать, возможна ли функция, принимающая массив и возвращающая массив в моем случае.

1 Ответ

0 голосов
/ 26 апреля 2018

Я не думаю, что можно написать функцию, которая делает синтаксис where is_valid in fn_yesno_to_int('yes', 'no') действительным.

Однако вы можете написать функцию, которую можно использовать, например where is_valid in (select * from fnyn1('yes', 'no')) или where is_valid = any(fnyn2('yes', 'no')):

CREATE function fnyn1(variadic labels text[] default '{}') returns setof int as $$
    select column1
    from (values(0, 'no'),(1, 'yes'))_
    join unnest(labels) u on column2 = u;
$$ language sql;

CREATE function fnyn2(variadic labels text[] default '{}') returns int[] as $$
    select array(
        select column1
        from (values(0, 'no'),(1, 'yes'))_
        join unnest(labels) u on column2 = u
    );
$$ language sql;
...