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

Đối sánh các mẫu giữa nhiều cột

Các câu trả lời cho đến nay không giải quyết được câu hỏi của bạn:

Hầu như không có bất kỳ sự khác biệt nào cho dù bạn sử dụng LIKE hoặc = miễn là bạn khớp với toàn bộ chuỗi (và không có ký tự đại diện nào in chuỗi của bạn). Để làm cho tìm kiếm mờ, bạn cần thay thế một phần của mô hình, không chỉ thêm vào nó.

Ví dụ:để khớp trên 7 (thay vì 8) ký tự cuối cùng của subcolumn :

SELECT *
FROM   maintable m
WHERE  left(maincolumn, 8) LIKE 
       ( '%' || left((SELECT subcolumn FROM subtable WHERE subid = 2), 7));

Tôi sử dụng left() đơn giản hơn (được giới thiệu với Postgres 9.1).
Bạn could đơn giản hóa điều này thành:

SELECT *
FROM   maintable m
WHERE  left(maincolumn, 7) =
       (SELECT left(subcolumn,7) FROM subtable WHERE subid = 2);

Nhưng bạn sẽ không làm thế nếu bạn sử dụng chỉ mục đặc biệt mà tôi đề cập ở phần dưới, bởi vì các biểu thức trong chỉ mục chức năng phải khớp chính xác để được sử dụng.

Bạn có thể quan tâm đến tiện ích mở rộng pg_tgrm .

Trong PostgreSQL 9.1 chạy một lần cho mỗi cơ sở dữ liệu:

CREATE EXTENSION pg_tgrm;

Hai lý do:

  • Nó cung cấp toán tử tương tự % . Với nó, bạn có thể xây dựng một tìm kiếm tương tự thông minh:

    --SELECT show_limit();
    SELECT set_limit(0.5); -- adjust similarity limit for % operator
    
    SELECT *
    FROM maintable m
    WHERE left(maincolumn, 8) %
          (SELECT subcolumn FROM subtable WHERE subid = 2);
    
  • Nó cung cấp hỗ trợ chỉ mục cho cả LIKE%

    Nếu hiệu suất đọc quan trọng hơn hiệu suất ghi, tôi khuyên bạn nên tạo chức năng Chỉ mục GIN hoặc GiST như thế này:

    CREATE INDEX maintable_maincol_tgrm_idx ON maintable
    USING gist (left(maincolumn, 8) gist_trgm_ops);
    

    Chỉ mục này hỗ trợ một trong hai truy vấn. Lưu ý rằng nó đi kèm với một số chi phí cho các hoạt động ghi.
    Điểm chuẩn nhanh cho một trường hợp tương tự trong câu trả lời có liên quan này .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhận kết quả đã nhập từ ActiveRecord thô SQL

  2. truy vấn với truy vấn con đếm, tham gia bên trong và nhóm

  3. Làm cách nào để nối ngoài hai bảng (bảng chính và nhiều-một) để chỉ nhận được MỘT mục từ bảng thứ hai?

  4. Sắp xếp theo thứ tự không hoạt động trên các cột được tính toán nếu đặt hàng theo áp dụng trên nhiều cột

  5. Cập nhật đơn đặt hàng trả lại bằng postgresql