2016-02-14 56 views
1

在postgres中,我有一个自定义函数将会加入名和姓。postgres函数返回的特定列名称

CREATE FUNCTION full_name(u users) RETURNS varchar 
    LANGUAGE plpgsql VOLATILE 
    AS $$ 
    BEGIN 
     RETURN CONCAT_WS(' ', u.first_name, u.last_name); 
    END; 
    $$; 

这将是很好,如果我不必设置列名的名称,它是由函数确定例如。

例如。在这里我要说的列名是FULL_NAME

SELECT 
full_name(users) as full_name 

但是这将是很好,如果它以原子命名为FULL_NAME

SELECT 
full_name(users) 

这是可能在自定义功能设置?

回答

0

这可能是解决您的问题的方法。您可以使用first_name和last_name作为函数的参数,而不是将用户作为参数传递。

CREATE OR REPLACE FUNCTION full_name(character varying ,character varying) 
RETURNS character varying AS 
$BODY$ 
declare 
    l_nom ALIAS FOR $1; 
    l_pnom ALIAS FOR $2; 
begin 

    RETURN CONCAT_WS(' ', l_nom, l_pnom);  
end;$BODY$ 
LANGUAGE plpgsql VOLATILE 
COST 100; 
    ALTER FUNCTION full_name(character varying ,character varying) OWNER TO postgres; 

SELECT full_name(u.first_name, u.last_name) 
1

由于函数参数是表的名称,您不必传递它。

你可以这样调用:

select users.full_name 
from users; 

请注意,您和表名前缀的函数名。您也可以使用别名,但仍需要前缀。

select u.full_name 
from users u; 

在这种情况下,从结果集列将被命名为full_name(函数的名称)

顺便说一句:你不需要PL/pgSQL里的功能。一个普通的SQL可能会更快。特别是当你声明stable而不是volatile时 - 它可以被内联,并且调用该函数的开销被消除。

0

尝试使用,而不是返回值out参数:

CREATE FUNCTION full_name(in u users, out full_name varchar) 
LANGUAGE plpgsql VOLATILE 
AS $$ 
    BEGIN 
    full_name := CONCAT_WS(' ', u.first_name, u.last_name); 
    END; 
$$; 

SELECT * FROM full_name(users)