(Không IN
cũng không phải ANY
là một "toán tử". Một "cấu trúc" hoặc "phần tử cú pháp".)
Về mặt logic , trích dẫn sách hướng dẫn:
IN
tương đương với= ANY
.
Nhưng có hai biến thể cú pháp trong tổng số IN
và hai biến thể của ANY
. Chi tiết:
- Làm cách nào để sử dụng ANY thay vì IN trong mệnh đề WHERE với Rails?
IN
chụp một bộ tương đương với = ANY
chụp một bộ , như được minh họa ở đây:
- postgreSQL - trong so với bất kỳ
Nhưng biến thể thứ hai của mỗi biến thể không tương đương với biến thể khác. Biến thể thứ hai của ANY
cấu trúc nhận một mảng (phải là một kiểu mảng thực tế), trong khi biến thể thứ hai của IN
lấy danh sách các giá trị được phân tách bằng dấu phẩy . Điều này dẫn đến các hạn chế khác nhau trong việc chuyển các giá trị và có thể cũng dẫn đến các kế hoạch truy vấn khác nhau trong các trường hợp đặc biệt:
- Chỉ mục không được sử dụng với
=any()
nhưng được sử dụng vớiin
- Chuyển nhiều bộ hoặc mảng giá trị cho một hàm
- Làm cách nào để so khớp các phần tử trong một mảng kiểu kết hợp?
ANY
linh hoạt hơn
ANY
cấu trúc linh hoạt hơn nhiều, vì nó có thể được kết hợp với nhiều toán tử khác nhau, không chỉ =
. Ví dụ:
SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
Đối với một số lượng lớn giá trị, cung cấp một bộ quy mô tốt hơn cho mỗi:
- Tối ưu hóa truy vấn Postgres với IN lớn
Có liên quan:
- PostgreSQL có thể lập chỉ mục các cột mảng không?
Đảo ngược / đối lập / loại trừ
"Tìm các hàng có id
nằm trong mảng đã cho ":
SELECT * FROM tbl WHERE id = ANY (ARRAY[1, 2]);
Inversion: "Tìm các hàng có id
không trong mảng ":
SELECT * FROM tbl WHERE id <> ALL (ARRAY[1, 2]);
SELECT * FROM tbl WHERE id <> ALL ('{1, 2}'); -- equivalent array literal
SELECT * FROM tbl WHERE NOT (id = ANY ('{1, 2}'));
Cả ba tương đương. Cái đầu tiên với hàm tạo mảng, hai cái còn lại với mảng ký tự. Kiểu dữ liệu có thể được lấy từ ngữ cảnh một cách rõ ràng. Ngoài ra, có thể yêu cầu diễn viên rõ ràng, chẳng hạn như '{1,2}'::int[]
.
Các hàng có id IS NULL
không vượt qua một trong hai biểu thức này. Để bao gồm NULL
giá trị bổ sung:
SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;