Arrays 是否需要不必要的postgres数组转换?

Arrays 是否需要不必要的postgres数组转换?,arrays,postgresql,casting,any,Arrays,Postgresql,Casting,Any,在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 = in

在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要求我将整数[]转换为整数[]?没有意义。

t的内部选择数组的结果不是一个整数[],而是一个包含一个整数[]的单行的结果集

你可以通过两种方式揭露正在发生的事情

如果你尝试

从t::text[]中选择1=ANYSELECT数组_aggid

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

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

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

另一种看待这一点的方式是反思

从选择数组中选择计数*从t中选择聚集ID作为z

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

但是,可以将包含一行一列的resultset强制转换为该单例类型的实例(在本例中为整数[])。这消除了我在这个子查询的任何一行中查找与我在这个子查询的单个行/列的数组中查找之间的歧义

因此,需要显式强制转换