我想要一個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都是不同的。
謝謝!
重寫原始問題而不是創建新問題。 – 2013-05-05 13:55:45
調查動態sql。 http://www.postgresql.org/docs/current/static/sql-do.html – 2013-05-05 14:02:22
這是一個完全不同的問題,它與以前的「SQL列名並將它們與PostgreSQL中另一個表中的行記錄進行比較」,因爲它給出了不同的問題。 「?柱?」這裏是關鍵。我不知道爲什麼會產生這種結果 – 2013-05-05 14:43:35