postgresql - PostgreSQL 9.5: Return columns based on input parameter
问题描述
I have the following table.
Table:
CREATE TABLE tblTest
(
Column1 int,
Column2 int,
Column3 int,
Column11 int,
Column111 int,
Column1111 int,
Column22 int,
Column222 int,
Column33 int
);
Records:
INSERT INTO tblTest VALUES(1,2,3,11,111,1111,22,222,33);
I am writting FUNCTION
to return the result from above table based on passed parameter.
The parameter p_ColumnName
is used to pass the column name. Based on column name the list of columns needs to be display.
Function:
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;
解决方案
我建议您在 Returns中使用类型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;
希望它会帮助你。
推荐阅读
- google-cloud-platform - 我对模块 Bitnami Odoo 12 Google 有疑问
- ag-grid - ag-grid 过滤器不适用于格式化的数值?
- ios - 用户点击后更改表格视图单元格的颜色,即使应用程序已刷新
- java - Vaadin 向导插件事件触发两次
- php - 与 table1 列相比,计算 table2 列的总数
- c# - LINQ Group by - linq to entity 无法识别方法 'char get_chars(int32) 方法
- python - 使用 ForeignKey 分配保存模型后调用 Model.refresh_from_db() 不起作用
- xml - 为什么我的 XML 模式不能识别错误?
- python-3.x - 使用 Python 创建具有特定内容的多个容器
- c++ - 给定一个“黑盒”枚举,是否可以检查提供的积分是否是 C++ 中枚举的有效成员?