使用 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
的变量并将其传递到我的函数中?
这里有两件事:
WHERE i IN (_filter);
应替换为
WHERE row(i) IN (_filter);
并致电:
select * from filterer(row(1));
我认为这个问题纯粹是学术性的,因为我看不到这种类型的任何用途?..
CREATE TYPE tp AS (i int);
我有一个 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
的变量并将其传递到我的函数中?
这里有两件事:
WHERE i IN (_filter);
应替换为
WHERE row(i) IN (_filter);
并致电:
select * from filterer(row(1));
我认为这个问题纯粹是学术性的,因为我看不到这种类型的任何用途?..
CREATE TYPE tp AS (i int);