1

这里有一个非常相似的问题,但与这个问题不完全相同。

我有一个函数,它使用IF语句来确定SELECT要返回的查询类型。

CREATE FUNCTION当我永远不知道其中的SELECT查询可能返回的确切列时,如何声明语句应返回的内容?也就是说,我无法RETURNS TABLE使用列列表设置声明,因为我不知道哪些列可能会返回。我所知道的是,我肯定希望返回一个结果表。

这是我的功能(未完成,伪):

CREATE OR REPLACE FUNCTION functiona(_url character varying DEFAULT NULL) 
RETURNS -- what type? if TABLE how do I know what columns to specify
    LANGUAGE plpgsql
AS
$$
DECLARE
    _urltypeid int;
BEGIN
    IF _url IS NOT NULL
    THEN
        _urltypeid := reference.urltype(_url);
        IF _urltypeid = 1
        THEN
            RETURN QUERY
                SELECT location, auxiliary, response FROM tablea -- unique columns from one table
        END IF;
    IF _urltypeid = 2
        THEN
            RETURN QUERY
                SELECT ip, location, host, authority FROM tableb -- unique columns from another table
        END IF;
    END IF;
END;
$$;

我来自 MS SQL Server 背景,我不必在CREATE FUNCTION语句中指定要返回的内容,因此这对我来说非常混乱。

4

2 回答 2

2

不是答案,而是使用一个简单的示例解释为什么@JonathanJacobson 的答案不起作用:

\d animals
                      Table "public.animals"
 Column |          Type          | Collation | Nullable | Default 
--------+------------------------+-----------+----------+---------
 id     | integer                |           | not null | 
 cond   | character varying(200) |           | not null | 
 animal | character varying(200) |           | not null | 

CREATE OR REPLACE FUNCTION public.animal(a_type character varying)
 RETURNS record
 LANGUAGE plpgsql
AS $function$
BEGIN
    SELECT row(id, cond, animal) FROM animals where animal = a_type;
END;
$function$

select * from animal('cat');
ERROR:  a column definition list is required for functions returning "record"
LINE 1: select * from animal('cat');

CREATE OR REPLACE FUNCTION public.animal(a_type character varying)
 RETURNS SETOF record
 LANGUAGE plpgsql
AS $function$
BEGIN
    RETURN QUERY
    SELECT id, cond, animal FROM animals where animal = a_type;
END;
$function$
;

 select * from animal('cat') as t(i integer, c varchar, a varchar);
 i |  c   |  a  
---+------+-----
 1 | fat  | cat
 2 | slim | cat
 6 | big  | cat

为了使用返回 a 的函数的输出,recordsetof record需要在运行函数时声明输出字段和类型。

于 2021-01-11T18:39:07.600 回答
-2

你可以使用record类型。未测试。

CREATE OR REPLACE FUNCTION functiona(_url character varying DEFAULT NULL)
RETURNS record
    LANGUAGE plpgsql
AS
$$
DECLARE
    _broadcasttypeid int;
BEGIN
    IF _url IS NOT NULL
    THEN
        _urltypeid := reference.urltype(_url);
        IF _urltypeid = 1
        THEN
            RETURN
                (SELECT row(location, auxiliary, response) FROM tablea);
        END IF;
    IF _urltypeid = 2
        THEN
            RETURN
                (SELECT row(ip, location, host, authority) FROM tableb);
        END IF;
    END IF;
END;
$$;

其他复合类型,例如jsonbhstore也是一种解决方案。

于 2021-01-11T17:43:06.790 回答