Postgresql

PostgreSQL 查詢中的未知返回類型

  • October 19, 2018

以下查詢有效:

SELECT a, b
FROM unnest(ARRAY[(1,2), (3,4)])
AS t(a integer, b integer);

a b
_ _
1 2
3 2

但是,我無法使用不同的列類型,例如varchar(255)

SELECT a, b
FROM unnest(ARRAY[(1,'hello'), (3,'world')])
AS t(a integer, b varchar(255));

ERROR:  42804: function return row and query-specified return row do not match
DETAIL:  Returned type unkown at ordinal position 2, but query expects text.

似乎在第二種情況下,列類型被推斷為unknown,它不會varchar(255)自動轉換為。

如何使第二個範例工作並返回具有正確類型的列,如果可能的話沒有警告並且不修改ARRAY[...]定義?

背景:我正在嘗試使用psycopg2Python 模組提高大型批量插入操作的性能,該模組不支持在VALUES參數中使用多行。我在嘗試其他一些方法時偶然發現了上面的例子。

您可以通過創建類型並將記錄轉換為它來執行此操作而不會生成警告:

create type t as (a integer, b varchar(255));

select * from unnest(array[(1,'hello'), (3,'world')]::t[]);
┌───┬───────┐
│ a │   b   │
├───┼───────┤
│ 1 │ hello │
│ 3 │ world │
└───┴───────┘

在 9.4 和 9.3 上測試(db<>fiddle here

它很難看,但您可以嘗試:

SELECT a, b::text
FROM unnest(ARRAY[(1,'hello'), (3,'world')])
AS t(a integer, b unknown);

這樣,定義的類型AS與 的輸出相匹配unnest(),您可以在SELECT列表中將其轉換為您的需要。

你可以在一個小的SQLFiddle中試試這個。

引用自:https://dba.stackexchange.com/questions/100665