2013-05-05 51 views
1

我想要一個SQL語句,其中SELECT列中的列名是子查詢。基本格式是:sql select(column-name)作爲PostgreSQL中的子查詢

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參數似乎有着根本性的不同,但是每個DB都是不同的。

謝謝!

+0

重寫原始問題而不是創建新問題。 – 2013-05-05 13:55:45

+1

調查動態sql。 http://www.postgresql.org/docs/current/static/sql-do.html – 2013-05-05 14:02:22

+0

這是一個完全不同的問題,它與以前的「SQL列名並將它們與PostgreSQL中另一個表中的行記錄進行比較」,因爲它給出了不同的問題。 「?柱?」這裏是關鍵。我不知道爲什麼會產生這種結果 – 2013-05-05 14:43:35

回答

1

如果括在括號數列的名字,像你這樣做:

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

..你有效地創建一個特設的排式從封閉列,它沒有名字,因爲你沒有提供別名。客戶將提供像?column?這樣的後備。你可以提供你自己的名字:

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

但是,你可能只是想個別列。刪除括號:

SELECT col1, col2, col3, col4 FROM tbl;