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

Tìm kiếm LIKE không nhạy cảm với giọng Postgres trong Rails 3.1 trên Heroku

Giải pháp của người đàn ông đáng thương

Nếu bạn có thể tạo một hàm, bạn có thể sử dụng hàm này. Tôi đã biên soạn danh sách bắt đầu từ tại đây và được thêm vào nó theo thời gian. Nó là khá đầy đủ. Bạn thậm chí có thể muốn xóa một số ký tự:

CREATE OR REPLACE FUNCTION lower_unaccent(text)
  RETURNS text AS
$func$
SELECT lower(translate($1
     , '¹²³áàâãäåāăąÀÁÂÃÄÅĀĂĄÆćčç©ĆČÇĐÐèéêёëēĕėęěÈÊËЁĒĔĖĘĚ€ğĞıìíîïìĩīĭÌÍÎÏЇÌĨĪĬłŁńňñŃŇÑòóôõöōŏőøÒÓÔÕÖŌŎŐØŒř®ŘšşșߊŞȘùúûüũūŭůÙÚÛÜŨŪŬŮýÿÝŸžżźŽŻŹ'
     , '123aaaaaaaaaaaaaaaaaaacccccccddeeeeeeeeeeeeeeeeeeeeggiiiiiiiiiiiiiiiiiillnnnnnnooooooooooooooooooorrrsssssssuuuuuuuuuuuuuuuuyyyyzzzzzz'
     ));
$func$ LANGUAGE sql IMMUTABLE;

Truy vấn của bạn sẽ hoạt động như vậy:

find(:all, :conditions => ["lower_unaccent(name) LIKE ?", "%#{search.downcase}%"])

Đối với các tìm kiếm được neo bên trái, bạn có thể sử dụng một chỉ mục trên hàm cho rất kết quả nhanh chóng:

CREATE INDEX tbl_name_lower_unaccent_idx
  ON fest (lower_unaccent(name) text_pattern_ops);

Đối với các truy vấn như:

SELECT * FROM tbl WHERE (lower_unaccent(name)) ~~ 'bob%'

Giải pháp thích hợp

Trong PostgreSQL 9.1+ , với các đặc quyền cần thiết, bạn chỉ có thể:

CREATE EXTENSION unaccent;

cung cấp một hàm unaccent() , làm những gì bạn cần (ngoại trừ lower() , chỉ cần sử dụng bổ sung nếu cần). Đọc hướng dẫn về tiện ích này .
Cũng có sẵn cho PostgreSQL 9.0 nhưng CREATE EXTENSION cú pháp mới trong 9.1.

Thông tin thêm về các chỉ mục và không thẳng thắn:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lược đồ cơ sở dữ liệu quan hệ để tìm nguồn cung ứng sự kiện

  2. `Select` cùng một bảng với` from` nghĩa là gì?

  3. Chuyển một hàng thành nhiều hàng với ít cột hơn

  4. Cải thiện tốc độ truy vấn:SELECT đơn giản trong bảng postgres lớn

  5. Trả về giá trị từ các phương thức ánh xạ MyBatis <insert>