我对postgresql很新。
实现这一目标的最佳方法是什么?
SELECT get_columns()
FROM table_name;
get_columns()
将提供查询的列名称。我看到人们建议使用EXECUTE语句,但我无法正常工作。
让我们说有一个表测试,列a,b,c 我想跑
SELECT a,b FROM Test;
SELECT a,c FROM Test;
动态生成列名。
答案 0 :(得分:4)
为了编写动态查询,您必须执行以下操作:
EXECUTE 'SELECT '|| get_columns()|| ' FROM table_name' INTO results
请阅读文档: http://developer.postgresql.org/pgdocs/postgres/plpgsql-statements.html
答案 1 :(得分:1)
在这种情况下,我会使用PL/pgSQL function using cursor。
答案 2 :(得分:0)
由于您正在将COPY FROM用于已知的大表,因此创建一个返回SETOF bigtable的FUNCTION并从特定类型中选择所有列,对于特定情况下不需要的字段使用NULL AS fieldname,类似于:
# \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(或其他)可能是合适的。
答案 3 :(得分:0)
您将无法使用函数生成列列表。而且我真的不认为这是解决问题的最佳方法......也就是说,你可以用8.4这样做:
CREATE OR REPLACE FUNCTION dyn(p_name VARCHAR) RETURNS SETOF RECORD AS $$ DECLARE p_sql TEXT; BEGIN SELECT 'SELECT ' || CASE p_name WHEN 'foo' THEN ' col1, col2, col3, col4 ' WHEN 'bar' THEN 'col3, col4, col5, col6' WHEN 'baz' THEN 'col1, col3, col4, col6' END || ' FROM mytest' INTO p_sql; RETURN QUERY EXECUTE p_sql; END $$ LANGUAGE 'plpgsql';
用法是: SELECT * FROM dyn('foo')AS(一个int,两个int,三个int,四个int)
但老实说,我建议只为每个设备制作一个视图。
答案 4 :(得分:0)
我认为你最大的问题是你需要以PostgreSQL可以理解的方式返回行。这基本上意味着您可以返回一个refcursor,也可以返回一组一致的数据类型。我更喜欢后者,因为从编程的角度来看,它使系统更加一致,并且你可以采取一些先进的方向,但我也可以看到另一种方式。
答案 5 :(得分:-3)
这是您在表格中获取列名称的方式:
SELECT
column_name
FROM
information_schema.columns
WHERE
table_name = 'test';