PostgreSQL 9.5:根据输入参数返回列

时间:2018-05-05 06:58:00

标签: postgresql postgresql-9.5

我有下表。

表格

CREATE TABLE tblTest
(
    Column1 int,
    Column2 int,
    Column3 int,
    Column11 int,
    Column111 int,
    Column1111 int,
    Column22 int,
    Column222 int,
    Column33 int
);

记录

INSERT INTO tblTest VALUES(1,2,3,11,111,1111,22,222,33);

我正在编写FUNCTION以根据传递的参数返回上表中的结果。

参数p_ColumnName用于传递列名。根据列名称,需要显示列的列表。

功能

CREATE OR REPLACE FUNCTION ufn_test
(
    p_ColumnName text
)
RETURNS -- ? How to specify the dynamic return type or dynamic column list ?
AS

$BODY$

DECLARE v_ColumnsList text;
    v_query text;
BEGIN

    IF p_ColumnName = 'Column1'
    THEN
        v_ColumnsList := 'Column11,Column111,Column1111';

    ELSIF p_ColumnName = 'Column2'
    THEN
        v_ColumnsList := 'Column22,Column222';

    ELSIF p_ColumnName = 'Column3'
    THEN
        v_ColumnsList := 'Column33';

    END IF;

    v_query := 'SELECT '|| v_ColumnsList ||' FROM tblTest';

    RETURN QUERY EXECUTE v_query;

END;

$BODY$

LANGUAGE PLPGSQL;

1 个答案:

答案 0 :(得分:0)

我建议你在Return中使用类型RefCursor

根据您使用的语言(SQL,Java ...),您可以从此Cursor获取数据。

所以,你的功能将变为

CREATE OR REPLACE FUNCTION ufn_test( p_ColumnName text )
RETURNS refcursor AS
$BODY$
DECLARE 
    v_ColumnsList text;
    v_query text;
    ref_cursor refcursor;
BEGIN

    IF (p_ColumnName = 'Column1') THEN
        v_ColumnsList := 'Column11,Column111,Column1111';
    ELSIF (p_ColumnName = 'Column2') THEN
        v_ColumnsList := 'Column22,Column222';
    ELSIF (p_ColumnName = 'Column3') THEN
        v_ColumnsList := 'Column33';
    END IF;

    v_query := 'SELECT '|| v_ColumnsList ||' FROM tblTest';

    OPEN ref_cursor FOR EXECUTE (v_query);

    RETURN ref_cursor;

END;
$BODY$
LANGUAGE plpgsql;

希望它会对你有帮助。