Postgresql
PostgreSQL 查詢中的未知返回類型
以下查詢有效:
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[...]
定義?背景:我正在嘗試使用
psycopg2
Python 模組提高大型批量插入操作的性能,該模組不支持在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中試試這個。