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参数中使用多行。我在尝试其他一些方法时偶然发现了上面的例子。
您可以通过创建类型并将记录转换为它来执行此操作,而不会生成警告:
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)
这很丑陋,但您可以尝试:
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 中尝试这个。
| 归档时间: |
|
| 查看次数: |
3368 次 |
| 最近记录: |