我试图有一个 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 参数的方式似乎有根本的不同,但每个数据库都是不同的。
谢谢!