具有可变参数varchar输入和可变参数整数输出的SQL函数

时间:2018-04-26 11:23:40

标签: sql postgresql plpgsql

我知道我可以使用内部联接和带有对应表的select来执行以下操作,但宁愿使用函数。

我们说我有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,'no'},{1,'yes'}}并使用它并放弃使用函数的想法。另一个可能更好的选择是翻转问题并调用foobar.is_valid上的函数将0,1映射到否,是;但是我很想知道在我的情况下采用数组和返回数组的函数是否可行。

1 个答案:

答案 0 :(得分:1)

我认为不可能编写一个使语法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;