使用 table 值参数在函数中过滤 table

Filter table in a function using a table valued parameter

我有一个 table 值函数,它使用参数过滤 table 和 returns 结果:

drop table if exists mytbl;
create table mytbl (i int);
insert into mytbl (i) values (1),(2),(3);

CREATE FUNCTION filterer(
    _filter int
)
RETURNS TABLE(i_ret int)
    LANGUAGE 'plpgsql'
AS $BODY$
BEGIN
    RETURN  QUERY   SELECT  i 
                    FROM    mytbl
                    WHERE   i = _filter;
END;
$BODY$;
select * from filterer(1);

它returns:

到目前为止一切顺利。但是,我真正想做的是过滤值列表而不是一个值。我认为这样做的方法是使用我使用 CREATE TYPE 定义的类型创建一个 table 值参数,但我无法让它工作。这是我目前所拥有的:

drop table if exists mytbl;
create table mytbl (i int);
DO $$
BEGIN
    IF NOT EXISTS (SELECT   * FROM  pg_type t WHERE t.typname = 'tp') THEN
        CREATE TYPE tp AS (i int);
    END IF;
END$$;
insert into mytbl (i) values (1),(2),(3);
DROP FUNCTION public.filterer(tp);
CREATE FUNCTION filterer(
    _filter tp
)
RETURNS TABLE(i_ret int)
    LANGUAGE 'plpgsql'
AS $BODY$
BEGIN
    RETURN  QUERY   SELECT  i 
                    FROM    mytbl
                    WHERE   i IN (_filter);
END;
$BODY$;

select * from filterer(1);

当我 运行 该代码失败时:

ERROR: function filterer(integer) does not exist LINE 23: select * from filterer(1);

如何声明类型为 tp 的变量并将其传递到我的函数中?

working example

这里有两件事:

 WHERE   i IN (_filter);

应替换为

 WHERE   row(i) IN (_filter);

并致电:

select * from filterer(row(1));

我认为这个问题纯粹是学术性的,因为我看不到这种类型的任何用途?..

CREATE TYPE tp AS (i int);