在postgresql中获取结果中的列名

时间:2016-08-27 11:38:31

标签: sql postgresql

在下面的查询中,我得到了数组格式的值,我也希望得到列名。

CREATE OR REPLACE FUNCTION load_page(IN _session integer)
  RETURNS TABLE(col1 text, col2 text) AS
$BODY$
BEGIN
    RETURN QUERY 
    select
    (SELECT array_agg(sq.*)
    FROM (SELECT user_id, user_name 
          FROM "user" 
          ) sq
    )::text,
    (SELECT array_agg(sq.*)
    FROM (SELECT client_id, client_name ,client_desc
          FROM "clients"
          ) sq
    )::text;
END;
$BODY$ LANGUAGE plpgsql STABLE;

结果是:

"("{""(2,Test)"",""(5,Santhosh)"",""(3,Test1)""}","{""(1,Test1,Test1)"",""(2,test2,test2)"",""(3,test3,test3)""}")"  

2 个答案:

答案 0 :(得分:0)

您只需键入它们并连接到一列,将其用作外部选择中的一行:

CREATE OR REPLACE FUNCTION load_page(IN _session integer)
  RETURNS TABLE(col1 text, col2 text) AS
$BODY$
BEGIN
    RETURN QUERY 
    select
    (SELECT array_agg(sq.*)
    FROM (SELECT concat('user_id: ',user_id,', user_name: ', user_name)
          FROM "user" 
          ) sq
    )::text,
    (SELECT array_agg(sq.*)
    FROM (SELECT concat('client_id: ',client_id,', client_name: ',client_name,', client_desc: ',client_desc)
          FROM "clients"
          ) sq
    )::text;
END;
$BODY$ LANGUAGE plpgsql STABLE;

如果您想要丢弃有关特定列的信息,如果它的值为NULL,您可以有条件地附加列名称(使用CASE语句)。

答案 1 :(得分:0)

下面的函数不会产生大括号或大量双引号,但它确实包含列名,它比初始版本更简洁,更易读,更有效。

永远不会使用_session参数,但我会假设这是一些较大查询/函数的所有部分。

CREATE OR REPLACE FUNCTION load_page(IN _session integer, OUT col1 text, OUT col2 text)
RETURNS SETOF record AS $BODY$
BEGIN
    SELECT string_agg('user_id: ' || user_id ||
                    ', user_name: ' || user_name, ',')
    INTO col1
    FROM "user";

    SELECT string_agg('client_id: ' || client_id ||
                    ', client_name: ' || client_name ||
                    ', client_desc: ' || client_desc, ',')
    INTO col2
    FROM "clients";

    RETURN NEXT;
END;
$BODY$ LANGUAGE plpgsql STABLE;