我正在尝试使用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语句的column-name参数的格式返回我的子查询SELECT,但因为我返回多行(我想要的列名的varchar的单个值),我以为我可以把它们粘在一起,但我不能。我正在使用psql所以我没有“@”列表技巧。
任何建议都将受到赞赏。
解决方案: 这就是问题不重复的原因,以及我如何解决它。在试图将问题简化为可管理的问题时,它失去了它的支持。我最终编写了一个函数,因为我无法使用@将列表传递给postgreSQL中的SELECT。当您只想选择行的子集时,即使使用AS也无法传递嵌套(SELECT),尽管这在Oracle中有效。结果,我编写了一个有效创建字符串的函数,然后将其作为SELECT传递。关于PostgreSQL中的SQL解析器如何处理来自Oracle的SELECT参数,似乎有一些根本不同的东西,但每个DB都不同。
谢谢!
答案 0 :(得分:1)
如果您在括号中包含多个列名称,请执行以下操作:
SELECT (col1, col2, col3, col4) FROM tbl;
..您可以从附带的列中有效地创建ad-hoc 行类型,这些列没有名称,因为您没有提供别名。客户端将提供类似?column?
的后备广告。您可以提供自己的名字:
SELECT (col1, col2, col3, col4) AS my_row_type FROM tbl;
但你可能只想要个别专栏。删掉括号:
SELECT col1, col2, col3, col4 FROM tbl;