我的查询:
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);
当我运行它,它会抛出以下错误:
ERROR: operator does not exist: integer = integer[]: 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)
这个SQL Fiddle的细节.
那我做错了什么?
解决方法
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的文件:
The right-hand side is a parenthesized subquery,which must return
exactly one column. The left-hand expression is evaluated and compared
to each row of the subquery result using the given operator,which
must yield a Boolean result. The result of ANY is “true” if any true
result is obtained. The result is “false” if no true result is found
(including the case where the subquery returns no rows).
…这个错误是有道理的,因为左边的表达式是一个整数 – 列b – 而右边的表达式是一个整数数组,或者是整数[],所以比较结果是形式integer = integer [],它不具有运算符,因此导致错误.
不察觉整数[]值使得左和右手表达式成为整数,因此比较可以继续.
注意:使用IN而不是= ANY时会看到相同的行为.