2013-05-31 113 views
1

我在嘗試寫一個SELECT查詢,它返回RECORDROWS在PostgreSQL中返回一行記錄

我解決了一半的問題,因爲我可以得到一個記錄返回一個單行。但是如何返回一組ROWS?

以下面的查詢,例如:

SELECT * FROM 
    RECORD(
    (
     ROW(1::integer, 'Florida'::character varying) 
    ) 
) AS tbl (id integer, state character varying) 

我得到了我預期:

+==============+ 
| id | state | 
+====+=========+ 
| 1 | Florida | 
+----+---------+ 

然而,當我試圖將一個附加行添加的記錄,這是我遇到的問題:

SELECT * FROM 
    RECORD(
    (
     ROW(1::integer, 'Florida'::character varying), 
     ROW(2::integer, 'Georgia'::character varying) 
    ) 
) AS tbl (id integer, state character varying) 

我預計的結果類似於:

+==============+ 
| id | state | 
+====+=========+ 
| 1 | Florida | 
+----+---------+ 
| 2 | Georgia | 
+----+---------+ 

不過,我收到以下錯誤的PostgreSQL代替:

********** Error ********** 
ERROR: function return row and query-specified return row do not match 
SQL state: 42804 
Detail: Returned type record at ordinal position 1, but query expects integer. 

它是什麼,我在這裏失蹤?一些微不足道的事情,或者我接近這一切都是錯誤的?任何指針或建議非常感謝,並感謝你!

在相關說明:我明白,如果這是發生在存儲過程中,我可以返回一個SETOF,但對於此用例,我有興趣直接通過查詢返回RECORD的ROWS,而無需使用的存儲過程。

回答

4

我不知道如何使用row構造要做到這一點,但使用values條款,似乎輕鬆了很多(和清潔)對我說:

select * 
from (
    values 
    (1, 'Florida'), 
    (2, 'Georgia') 
) AS tbl (id, state); 

或使用CTE

with tbl (id, state) as (
    values 
    (1, 'Florida'), 
    (2, 'Georgia') 
) 
select * 
from tbl; 

如果我沒有弄錯,使用RECORD關鍵字會將兩行記錄轉換成單個記錄記錄。一條記錄永遠不能保存多行。

編輯(後克雷格的評論):

要完成的圖片,下面將返回完全相同的結果雖然沒有可能性指定列名:

values 
    (1, 'Florida'), 
    (2, 'Georgia'); 

這可以用於任何地方都可以使用SELECT

+0

我相信這實際上覆蓋了我的用例!也許我對RECORDs的工作原理有誤解,但我仍然非常好奇如何利用ROWs。非常感謝您的時間。 :) –

+0

@JoshuaBurns:實際上我認爲你不能在PL/pgSQL之外使用'RECORD',但我不完全確定。但是'RECORD'總是代表一個*單*行(記錄)。所以我不認爲這會以任何方式工作。 –

+0

'VALUES'構造是完成此操作的正確方法。你其實不需要'WITH'或'SELECT'; 'VALUES'是一個有效的獨立查詢。 –