PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Toán tử IN so với BẤT KỲ trong PostgreSQL

(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ới in
  • 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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách chèn dữ liệu vào bảng bằng các thủ tục được lưu trữ trong postgresql

  2. ứng dụng khách postgresql tốt cho windows?

  3. Cần tìm gì nếu Bản sao PostgreSQL của bạn đang bị trễ

  4. Có nhóm theo điều khoản - elein’s GeneralBits

  5. Các truy vấn được tham số hóa với psycopg2 / Python DB-API và PostgreSQL