2016-02-14 52 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)