gpt4 book ai didi

PostgreSQL 在空构造函数数组上失败

转载 作者:行者123 更新时间:2023-11-29 12:09:53 26 4
gpt4 key购买 nike

我遇到了一个关于数组的奇怪情况,这看起来像是 PostgreSQL 中的一个错误,除非我遗漏了什么......

根据 PostgreSQL 文档,数组的构造函数和字符串表示是可以互换的,即我们可以编写 ARRAY[1,2,3]'{1,2,3}' ,这是一样的。

然而,我发现了一个案例,他们没有得到同样的对待。

我正在使用自动 SQL 生成器进行多行更新,生成以下内容:

UPDATE "myTable" AS t SET "data"=v."data"::int[] FROM (VALUES(1, array[]))
AS v("id", "data") WHERE t.id=v.id

表格如下:

CREATE TABLE myTable(
id serial PRIMARY KEY,
data int[] NULL
);

执行该查询会产生错误 - 无法确定空数组的类型,即使我们明确地转换了列类型也是如此。

如果我用等效的 '{}' 替换 array[],它就会突然起作用。

我以前从未见过这种情况,这是第一次,也许是一种独特的情况,但据我所知,它违反了 PostgreSQL 文档中有关可互换数组表示的规定。


更多例子,说明问题:

这些工作:

UPDATE "myTable" AS t SET "data"=v."data"::int[] FROM (VALUES(1, array[1,2,3]))
AS v("id", "data") WHERE t.id=v.id

UPDATE "myTable" AS t SET "data"=v."data"::int[] FROM (VALUES(1, '{1,2,3}'))
AS v("id", "data") WHERE t.id=v.id

UPDATE "myTable" AS t SET "data"=v."data"::int[] FROM (VALUES(1, '{}'))
AS v("id", "data") WHERE t.id=v.id

这个不行:

UPDATE "myTable" AS t SET "data"=v."data"::int[] FROM (VALUES(1, array[]))
AS v("id", "data") WHERE t.id=v.id

所以数组构造函数的类型转换工作,只要数组不为空,就像它是空的一样,类型转换就停止工作。

最佳答案

类型信息支持:

pokus1=# select array[];
ERROR: cannot determine type of empty array
LINE 1: select array[];
^
HINT: Explicitly cast to the desired type, for example ARRAY[]::integer[].
pokus1=# select array[]::integer[];
array
-------
{}
(1 row)

关于PostgreSQL 在空构造函数数组上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41893444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com