运算符不存在:带有ANY的查询中的integer = integer []

时间:2014-09-01 07:14:45

标签: sql postgresql

我经常使用integer = ANY(integer[])语法,但现在任何运算符都不起作用。这是我第一次使用它来比较标量和从CTE返回的整数,但我认为这不应该导致问题。

我的查询:

WITH bar AS (
  SELECT array_agg(b) AS bs
  FROM foo
  WHERE c < 3
)
SELECT a FROM foo WHERE b = ANY ( SELECT bs FROM bar);

当我运行它时,它会抛出以下错误:

  

错误:运算符不存在:integer = integer []:WITH bar AS(   SELECT array_agg(b)AS bs FROM foo WHERE c&lt; 3)选择FROM foo   WHERE b = ANY(SELECT bs FROM bar)

SQL Fiddle中的详细信息。

那么我做错了什么?

4 个答案:

答案 0 :(得分:18)

根据错误消息部分operator does not exist: integer = integer[]bs列似乎需要unnest,以便让右侧回到integer所以可以找到比较运算符:

WITH bar AS (
  SELECT array_agg(b) AS bs
  FROM foo
  WHERE c < 3
)
SELECT a
FROM foo
WHERE b = ANY ( SELECT unnest(bs) FROM bar);

这导致输出:

A
2
3

给出ANY function的文档:

  

右侧是带括号的子查询,必须返回   正好一列。评估并比较左侧表达式   使用给定的运算符到子查询结果的每一行   必须产生布尔结果。任何结果都是&#34; true&#34;如果有的话   得到的结果。结果是&#34; false&#34;如果没有找到真实的结果   (包括子查询不返回任何行的情况)。

...错误有意义,因为左手表达式是integer - 列b - 而右手表达式是integer s的数组,或integer[],因此比较最终是integer = integer[]形式,它没有运算符,因此会导致错误。

unnest integer[]值会生成左手和右手表达式integer,因此比较可以继续。

修改了SQL Fiddle

注意:使用IN代替= ANY时会出现相同的行为。

答案 1 :(得分:0)

列需要不需要

WITH bar AS(   SELECT array_agg(b)AS bs   来自foo   在哪里c&lt; 3 ) 选择一个 来自foo WHERE b = ANY(SELECT unnest(bs)FROM bar);

答案 2 :(得分:0)

没有被取消

WITH bar AS (
  SELECT array_agg(b) AS bs
  FROM foo
  WHERE c < 3
)
SELECT a FROM foo WHERE ( SELECT b = ANY (bs) FROM bar);

答案 3 :(得分:0)

仅供参考,对于我

SELECT ... WHERE "id" IN (SELECT unnest(ids) FROM tablewithids)

更快

SELECT ... WHERE "id" = ANY((SELECT ids FROM tablewithids)::INT[])

虽然没有对此做任何研究。