2

我试图有一个 SQL 语句,其中 SELECT 中的列名是子查询。基本格式是:

SELECT (<subquery for columns>) FROM Table;

我的子查询返回 4 行字段名称,因此我需要将它们设为单行。我用了:

SELECT array_to_string(array_agg(column_names::text),',') FROM Fieldnames;

然后我得到一个 col1, col2, col3, col4 的返回格式,用于我的 4 个返回行作为字符串。如果我为我的查询粘贴原始测试,它可以正常工作:

SELECT (col1, col2, col3, col4) FROM Table;

当我将两者放在一起时,问题就出现了。我从 psql 得到一个奇怪的响应。我得到一个:

?column?
col1, col2, col3, col4

没有返回任何行:

SELECT(SELECT array_to_string(array_agg(column_names::text),',') FROM Fieldnames) FROM Table;

从概念上讲,我认为有两种方法可以解决这个问题。我需要以我可以将列名参数作为第一个 SELECT 语句的列名参数的格式恢复我的子查询 SELECT,但是因为我返回了多行(对于我想要的列名的 varchar 的单个值),我以为我可以将它们粘贴在一起,但我不能。我正在使用 psql,所以我没有“@”列表技巧。

任何意见,将不胜感激。

解决方案:这就是为什么这个问题不是重复的,以及我是如何解决的。在试图将问题简化为易于管理的过程中,它失去了它的力量。我最终编写了一个函数,因为我无法在 postgreSQL 中使用 @ 将列表传递给 SELECT。当您只想选择行的子集时,即使使用 AS,也不能传递嵌套 (SELECT),尽管这在 Oracle 中有效。结果,我编写了一个函数,它有效地创建了一个字符串,然后将其作为 SELECT 传递。PostgreSQL 中的 SQL 解析器如何处理来自 Oracle 的 SELECT 参数的方式似乎有根本的不同,但每个数据库都是不同的。

谢谢!

4

1 回答 1

1

如果像您这样将多个列名括在括号中:

SELECT (col1, col2, col3, col4) FROM tbl;

.. 您从封闭的列中有效地创建了一个临时行类型,该列没有名称,因为您没有提供别名。Postgres 会选择像?column?. 在以后的 Postgres 版本中,默认值是row因为在内部,上面是以下的简短语法:

SELECT ROW(col1, col2, col3, col4) FROM tbl;

提供您自己的姓名(别名):

SELECT (col1, col2, col3, col4) AS my_row_type FROM tbl;

但您可能只需要单独的列。去掉括号:

SELECT col1, col2, col3, col4 FROM tbl;
于 2013-05-05T18:46:45.120 回答