Postgresql 如何从过程返回所有字段?

Postgresql 如何从过程返回所有字段?,postgresql,stored-procedures,Postgresql,Stored Procedures,现在我有以下程序: CREATE OR REPLACE FUNCTION find_city_by_name(match varchar) RETURNS TABLE(city_name varchar) LANGUAGE plpgsql as $$ BEGIN RETURN QUERY WITH r AS ( SELECT short_name FROM geo_cities WHERE shor

现在我有以下程序:

CREATE OR REPLACE FUNCTION find_city_by_name(match varchar) RETURNS TABLE(city_name varchar) LANGUAGE plpgsql as $$

        BEGIN
                RETURN QUERY WITH r AS (
                        SELECT short_name FROM geo_cities WHERE short_name ILIKE CONCAT(match, '%')
                )
                SELECT r.short_name FROM r;
        END;

$$

我要返回所有字段*而不仅仅是短名称。我需要在我的过程中更改什么?

如果你想要一个实行,你必须在return子句中显式声明所有字段:

create table geo_cities (
    short_name varchar,
    long_name varchar
);

insert into geo_cities values ('BERLIN', 'BERLIN'), ('BERLIN 2','BERLIN TWO');

CREATE OR REPLACE FUNCTION find_city_by_name(match varchar) 
    RETURNS TABLE(city_name varchar, long_name varchar) 
    LANGUAGE plpgsql 
AS 
$$
    BEGIN
            RETURN QUERY WITH r AS (
                    SELECT * FROM geo_cities WHERE short_name ILIKE CONCAT(match, '%')
            )
            SELECT * FROM r;
    END;
$$;

select * from find_city_by_name('BERLIN');

请参阅运行于以下位置的示例:

如果您想要一个实行,则必须显式声明return子句中的所有字段:

create table geo_cities (
    short_name varchar,
    long_name varchar
);

insert into geo_cities values ('BERLIN', 'BERLIN'), ('BERLIN 2','BERLIN TWO');

CREATE OR REPLACE FUNCTION find_city_by_name(match varchar) 
    RETURNS TABLE(city_name varchar, long_name varchar) 
    LANGUAGE plpgsql 
AS 
$$
    BEGIN
            RETURN QUERY WITH r AS (
                    SELECT * FROM geo_cities WHERE short_name ILIKE CONCAT(match, '%')
            )
            SELECT * FROM r;
    END;
$$;

select * from find_city_by_name('BERLIN');
请参阅运行在以下位置的示例:

这里是一个简化的w/o WITH and WITH language sql版本,我已在对相邻答案的评论中提到:

create or replace function find_city_by_name(text)
  returns table(city_name varchar, long_name varchar)
as $$
  select * from geo_cities where short_name ilike $1 || '%';
$$ language sql;
此外,您可能会发现,使用geo_cities集合引用定义函数签名的geo_cities表本身更方便:

-这将允许您更改geo_cities表的结构,而无需更改函数的定义。

以下是一个简化的w/o和sql语言版本,我已在对相邻答案的评论中提到:

create or replace function find_city_by_name(text)
  returns table(city_name varchar, long_name varchar)
as $$
  select * from geo_cities where short_name ilike $1 || '%';
$$ language sql;
此外,您可能会发现,使用geo_cities集合引用定义函数签名的geo_cities表本身更方便:


-这将允许您更改geo_cities表的结构,而不需要更改函数的定义。

如何调用函数?如何调用函数?我还注意到,这里实际上不需要plpgsql。这个函数可以很容易地用sql语言定义,并且定义会更短。这里看起来也像smth,这不是真的需要。是的。但我相信这个过程是一个更复杂的例子。在这种情况下,重要的部分是返回tablecity\u name varchar,long\u name varcharI还注意到这里并不真正需要plpgsql。这个函数可以很容易地用sql语言定义,并且定义会更短。这里看起来也像smth,这不是真的需要。是的。但我相信这个过程是一个更复杂的例子。在这种情况下,重要的部分是返回tablecity\u name varchar,我需要的是long\u name varcharsetof geo\u cities,因为我不想在return子句中声明显式的所有字段。谢谢你的回答如果我在功能中添加内部连接,geo_cities对我没有帮助。在这种情况下,如何更改return子句?我的意思是返回表*,在这种情况下,您需要显式登记列。另外两个选项超出了我们在这里讨论的范围:创建视图v1作为选择。。。参加然后设置v1,但改变表格将是痛苦的;b探索Postgres的NoSQL/schemaless power–JSONB数据类型,使用它,从函数中返回JSON数据,这将为您提供更多的自由和灵活性。我需要设置geo_cities,因为我不想在return子句中声明显式的所有字段。谢谢你的回答如果我在功能中添加内部连接,geo_cities对我没有帮助。在这种情况下,如何更改return子句?我的意思是返回表*,在这种情况下,您需要显式登记列。另外两个选项超出了我们在这里讨论的范围:创建视图v1作为选择。。。参加然后设置v1,但改变表格将是痛苦的;b探索Postgres的NoSQL/Schemeless power–JSONB数据类型,使用它,从函数返回JSON数据,这将给您更多的自由和灵活性。