[英]Dynamic column in SELECT statement postgres
我对 postgresql 很陌生。
实现这一目标的最佳方法是什么?
SELECT get_columns()
FROM table_name;
get_columns()
将为查询提供列名。 我看到有人建议使用 EXECUTE 语句,但我无法做到这一点。
假设有包含 a、b、c 列的表 Test,我想运行
SELECT a,b FROM Test;
SELECT a,c FROM Test;
列名是动态生成的。
为了编写动态查询,您必须执行以下操作:
EXECUTE 'SELECT '|| get_columns()|| ' FROM table_name' INTO results
请阅读文档: http : //developer.postgresql.org/pgdocs/postgres/plpgsql-statements.html
在这种情况下,我会使用PL/pgSQL 函数使用 cursor 。
我认为您最大的问题是您需要以 PostgreSQL 可以理解的方式返回行。 这意味着基本上,您可以返回一个 refcursor,也可以返回一组一致的数据类型。 我更喜欢后者,因为从编程的角度来看,它使系统更加一致,并且您可以采用一些高级方向,但我也可以看到另一种方式。
由于您使用 COPY FROM 到一个已知的大表,创建一个返回 SETOF bigtable 并从特定类型中选择所有列的 FUNCTION,对于在该特定情况下不需要的字段使用 NULL AS 字段名,例如:
# \d SMALL
Table "public.small"
Column | Type | Modifiers
--------+---------+-----------
a | integer |
b | integer |
c | integer |
d | integer |
# \d LARGE
Table "public.large"
Column | Type | Modifiers
--------+---------+-----------
a | integer |
b | integer |
c | integer |
d | integer |
# CREATE OR REPLACE FUNCTION myData()
RETURNS SETOF large LANGUAGE SQL AS $$
SELECT a,
CASE WHEN a = 1
THEN b
ELSE
NULL
END as b,
CASE WHEN a = 2
THEN c
ELSE
NULL
END AS c,
d
FROM small;
$$;
# SELECT * FROM mydata();
# COPY (SELECT * FROM myData()) TO STDOUT;
显然 SQL 可能不是最好的语言,所以 PL/PgSQL 或 PL/Perl(或其他)可能是合适的。
您将无法使用函数来生成列列表。 而且我真的不认为这是解决问题的最佳方法......也就是说,您可以像这样使用 8.4 来做到这一点:
创建或替换函数 dyn(p_name VARCHAR)\n返回 SETOF 记录为\n $$\n 宣布\n p_sql 文本;\n 开始\n 选择'选择'||\n CASE p_name WHEN 'foo' THEN ' col1, col2, col3, col4 '\n WHEN 'bar' THEN 'col3, col4, col5, col6'\n WHEN 'baz' THEN 'col1, col3, col4, col6' END ||\n '来自我的测试'\n 进入 p_sql;\n 返回查询执行 p_sql;\n 结尾\n $$ LANGUAGE 'plpgsql';
用法是:SELECT * FROM dyn('foo') AS(一个整数,两个整数,三个整数,四个整数)
但老实说,我建议只为每个设备做一个视图。
我对Postgresql很陌生。
实现此目标的最佳方法是什么?
SELECT get_columns()
FROM table_name;
get_columns()
将提供查询的列名称。 我看到有人建议使用EXECUTE语句,但我无法正常工作。
可以说有一个带有列a,b,c的表Test,我想运行
SELECT a,b FROM Test;
SELECT a,c FROM Test;
具有动态生成的列名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.