Re: BUG #18430: syntax error when using aggregate function in where clause of subquery
От
Tom Lane
Тема
Re: BUG #18430: syntax error when using aggregate function in where clause of subquery
Дата
Msg-id
483376.1712949255@sss.pgh.pa.us
Ответ на
Список
Дерево обсуждения
BUG #18430: syntax error when using aggregate function in where clause of subquery PG Bug reporting form <noreply@postgresql.org>
Re: BUG #18430: syntax error when using aggregate function in where clause of subquery "David G. Johnston" <david.g.johnston@gmail.com>
Re: BUG #18430: syntax error when using aggregate function in where clause of subquery Laurenz Albe <laurenz.albe@cybertec.at>
Re: BUG #18430: syntax error when using aggregate function in where clause of subquery Eric Atkin <eatkin@certusllc.us>
Re: BUG #18430: syntax error when using aggregate function in where clause of subquery Tom Lane <tgl@sss.pgh.pa.us>
Re: BUG #18430: syntax error when using aggregate function in where clause of subquery Eric Atkin <eatkin@certusllc.us>
Eric Atkin writes:
> It seems the aggregate function call should be evaluated at the outer layer
> (where it would not be bad syntax) and then is a constant for the inner
> query where clause where an array would be allowed.
Correct, but the problem is not with the array_agg call, it's with
your use of IN. In the first place, IN requires parens around its
righthand side. But that only gets us past "syntax error":
regression=# SELECT
city,
(SELECT count(*) FROM delivery WHERE driver_id IN (array_agg(driver.id)))
AS deliveries
FROM driver
GROUP BY city
;
ERROR: operator does not exist: integer = integer[]
LINE 3: ... (SELECT count(*) FROM delivery WHERE driver_id IN (array_...
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
That's because what's inside the parens is supposed to be either a
sub-select or a list of things directly comparable to the LHS.
To do what you're after, you need to use the "scalar = ANY(array)"
construct:
regression=# SELECT
city,
(SELECT count(*) FROM delivery WHERE driver_id = any (array_agg(driver.id)))
AS deliveries
FROM driver
GROUP BY city
;
city | deliveries
------+------------
(0 rows)
IN and =ANY are more-or-less equivalent when the RHS is a sub-select,
but not for an array RHS.
There's nothing particularly wrong with Laurenz's construction,
but it's not necessary to split it up like that.
regards, tom lane
В списке pgsql-bugs по дате отправления
От: Tom Lane
Дата:
От: Eric Atkin
Дата: