我知道我可以使用内部联接和带有对应表的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映射到否,是;但是我很想知道在我的情况下采用数组和返回数组的函数是否可行。
答案 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;