我经常使用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中的详细信息。
那么我做错了什么?
答案 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[])
虽然没有对此做任何研究。