Biểu thức select array_agg(4)
trả về tập hợp các hàng (thực sự là tập hợp các hàng có 1 hàng). Do đó, truy vấn
select *
from b
where b.id = any (select array_agg(4)) -- ERROR
cố gắng so sánh một số nguyên (b.id) với một giá trị của một hàng (có 1 cột kiểu số nguyên []). Nó gây ra lỗi.
Để khắc phục, bạn nên sử dụng truy vấn con trả về số nguyên (không phải mảng số nguyên):
select *
from b
where b.id = any (select unnest(array_agg(4)))
Ngoài ra, bạn có thể đặt tên cột của kết quả là select array_agg(4)
làm đối số của any
, ví dụ:
select *
from b
cross join (select array_agg(4)) agg(arr)
where b.id = any (arr)
hoặc
with agg as (
select array_agg(4) as arr)
select *
from b
cross join agg
where b.id = any (arr)
Chính thức hơn, hai truy vấn đầu tiên sử dụng ANY
có dạng:
expression operator ANY (subquery)
và hai cái còn lại sử dụng
Toán tử biểu thứcexpression operator ANY (array expression)
giống như nó được mô tả trong tài liệu: 9.22.4. ANY / MỘT SỐ và 9.23.3. BẤT KỲ / MỘT SỐ (mảng) .