PostgreSQL 查询中的未知返回类型

F.X*_*.X. 10 postgresql datatypes type-conversion

以下查询有效:

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

a b
_ _
1 2
3 2
Run Code Online (Sandbox Code Playgroud)

但是,我无法使用不同的列类型,例如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.
Run Code Online (Sandbox Code Playgroud)

似乎在第二种情况下,列类型被推断为unknown,而不会varchar(255)自动转换为。

如果可能,我如何使第二个示例工作并返回正确类型的列,如果可能没有警告并且不修改ARRAY[...]定义?

背景:我正在尝试使用psycopg2Python 模块提高大型批量插入操作的性能,该模块不支持在VALUES参数中使用多行。我在尝试其他一些方法时偶然发现了上面的例子。

Jac*_*las 8

您可以通过创建类型并将记录转换为它来执行此操作,而不会生成警告:

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

select * from unnest(array[(1,'hello'), (3,'world')]::t[]);
?????????????
? a ?   b   ?
?????????????
? 1 ? hello ?
? 3 ? world ?
?????????????
Run Code Online (Sandbox Code Playgroud)

在 9.4 和 9.3 上测试(db<>fiddle here


dez*_*zso 7

这很丑陋,但您可以尝试:

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

这样, 中定义的类型AS与 的输出相匹配unnest(),您可以将其转换为SELECT列表中的需要。

你可以在一个小的SQLFiddle 中尝试这个。