首页 文章

sql select(column-name)作为postgreSQL中的子查询[duplicate]

提问于
浏览
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语句的column-name参数的格式返回我的子查询SELECT,但是因为我返回多行(我想要的列名的varchar的单个值),我以为我可以将它们粘贴在一起,但我不能 . 我正在使用psql所以我没有“@”列表技巧 .

任何意见,将不胜感激 .

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

谢谢!

1 回答

  • 1

    如果在括号中包含多个列名称,就像这样:

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

    ..你有效地创建了一个ad-hoc row type 来自封闭的列,没有名称,因为你没有提供别名 . 客户端将提供类似 ?column? 的后备 . 你可以提供自己的名字:

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

    但您可能只想要单独的列 . 删除括号:

    SELECT col1, col2, col3, col4 FROM tbl;
    

相关问题