2016-02-14 2 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 (название функции)

Btw: вам не нужно 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) 
Смежные вопросы