Tôi thường sử dụng cú pháp integer = ANY(integer[])
, nhưng bây giờ bất kỳ toán tử nào không hoạt động. Đây là lần đầu tiên tôi sử dụng nó để so sánh một vô hướng với một số nguyên được trả về từ CTE, nhưng tôi nghĩ rằng điều này sẽ không gây ra vấn đề.Toán tử không tồn tại: số nguyên = số nguyên [] trong truy vấn có ANY
truy vấn của tôi:
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);
Khi tôi chạy nó, nó throws lỗi sau:
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)
Chi tiết trong SQL Fiddle này.
Vì vậy, tôi đang làm gì sai?
Giải thích thêm dựa trên câu trả lời của bạn: Bởi vì '1 = BẤT CỨ (ARRAY [1,2,3])' là hợp pháp, nó là hợp lý cũng mong đợi '1 = BẤT CỨ (SELECT ARRAY [1,2,3]) 'là hợp pháp, nhưng không phải vì điều đó tạo ra sự mơ hồ về việc bạn có muốn' 1 = ARRAY [1,2,3] 'hay' 1 = 1 OR 1 = 2 HOẶC 1 = 3' và trình phân tích cú pháp không đủ thông minh để chỉ ra rằng chỉ một người có thể hợp pháp. Bạn có thể nói rằng bạn thực sự muốn dạng mảng BẤT CỨ với '1 = ANY ((SELECT ARRAY [1,2,3]) :: int [])' (mà tôi sẽ làm thay vì 'unnest'ing). –
Ah, thú vị.Cảm ơn các chi tiết bổ sung. – khampson
@CraigRinger: cảm ơn bạn! Câu trả lời của Ken đã giúp tôi làm thế nào để làm điều đó đúng, nhưng bình luận của bạn làm cho tôi hiểu tại sao truy vấn của tôi là sai. –