gpt4 book ai didi

arrays - 需要不必要的 postgres 数组转换吗?

转载 作者:行者123 更新时间:2023-11-29 12:05:06 25 4
gpt4 key购买 nike

在 Postgres 9.3 中进行以下设置:

CREATE TABLE t (id INTEGER);
INSERT INTO t VALUES (1), (2), (3);

我将这些值聚合到数组中(不要问为什么,实际设置非常复杂,所以我只需要这种方法)。

现在我需要检查某个整数是否属于数组。试过这个:

SELECT 1=ANY((SELECT array_agg(id) FROM t))

出现错误:

ERROR:  operator does not exist: integer = integer[]
LINE 1: SELECT 1=ANY((SELECT array_agg(id) FROM t))
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.

经过一些实验找到了可行的解决方案:

SELECT 1=ANY((SELECT array_agg(id) FROM t)::integer[])

为什么 postgres 要求我将 integer[] 转换为 integer[]?没有意义。

最佳答案

内部选择 (SELECT array_agg(id) FROM t) 的结果不是 integer[] 它是一个结果集,其中包含一个 >整数[]

您可以通过两种方式公开正在发生的事情。

如果你尝试

SELECT 1=ANY((SELECT array_agg(id) FROM t::text[]);

错误信息是错误:运算符不存在:整数 = 文本

请注意,错误消息不是指 text[],而是指 text

这是因为相等性是将左参数与右参数的每个元素进行比较。因此,在您的原始查询中,它是 integer[] 的结果集,它试图将 1 与每个(您只有一个)integer 进行比较[].

另一种方式是反射(reflection)

select count(*) from (select array_agg(id) from t) 作为 z

这会将您的原始子查询嵌入为 z -- 并返回 1 行。如果您尝试将 z 转换为 integer[],它不会起作用——因为 FROM 子句需要一个结果集,而不是一个整数数组。

但是,可以将包含一行和一列的结果集转换为该单例类型的实例(在本例中为 integer[])。这消除了“我正在查看此子查询的任何行”和“我正在查看此子查询的单个行/列的数组”之间的歧义。

因此,需要显式转换。

关于arrays - 需要不必要的 postgres 数组转换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27274400/

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