繁体   English   中英

SELECT 语句 postgres 中的动态列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM