这个问题在这里已有答案:
我试图有一个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都不同 .
谢谢!
1 回答
如果在括号中包含多个列名称,就像这样:
..你有效地创建了一个ad-hoc row type 来自封闭的列,没有名称,因为你没有提供别名 . 客户端将提供类似
?column?
的后备 . 你可以提供自己的名字:但您可能只想要单独的列 . 删除括号: