SELECT语句postgres中的动态列

时间:2010-03-03 20:24:16

标签: sql postgresql

我对postgresql很新。

实现这一目标的最佳方法是什么?

SELECT get_columns() 
  FROM table_name;

get_columns()将提供查询的列名称。我看到人们建议使用EXECUTE语句,但我无法正常工作。

让我们说有一个表测试,列a,b,c 我想跑

SELECT a,b FROM Test;
SELECT a,c FROM Test;

动态生成列名。

6 个答案:

答案 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';