2012-11-28 40 views
15

thể trùng lặp:
Does PostgreSQL support “accent insensitive” collations?Chức năng để loại bỏ dấu trong PostgreSQL

Tôi đang cố gắng để loại bỏ các điểm nhấn như vậy khi tôi thực hiện một CHỌN nó bỏ qua chúng.

Ví dụ:

SELECT * FROM table WHERE 
table.id ILIKE 'Jose'; 

Nó trả về:

José 
Jose 
Jósé 
Jóse 

hoặc một cái gì đó như thế.

Tôi tìm thấy các chức năng này và chúng không hoạt động, tôi nghĩ rằng có thể thực tế là tôi đang sử dụng Struts 1.X, vui lòng kiểm tra và cho tôi biết tôi đang ở đâu hoặc tôi nên làm gì sử dụng.

FIRST CHỨC NĂNG

CREATE OR REPLACE FUNCTION unaccent_string(text) RETURNS text AS $$ 
DECLARE 
    input_string text := $1; 
BEGIN 

input_string := translate(input_string, 'âãäåāăąÁÂÃÄÅĀĂĄ', 'aaaaaaaaaaaaaaa'); 
input_string := translate(input_string, 'èééêëēĕėęěĒĔĖĘĚ', 'eeeeeeeeeeeeeee'); 
input_string := translate(input_string, 'ìíîïìĩīĭÌÍÎÏÌĨĪĬ', 'iiiiiiiiiiiiiiii'); 
input_string := translate(input_string, 'óôõöōŏőÒÓÔÕÖŌŎŐ', 'ooooooooooooooo'); 
input_string := translate(input_string, 'ùúûüũūŭůÙÚÛÜŨŪŬŮ', 'uuuuuuuuuuuuuuuu'); 

return input_string; 
END; 
$$ LANGUAGE plpgql; 

CHỨC NĂNG THỨ HAI

CREATE OR REPLACE FUNCTION norm_text_latin(character varying) 
    RETURNS character varying AS 
$BODY$ 
declare 
     p_str alias for $1; 
     v_str varchar; 
begin 
     select translate(p_str, 'ÀÁÂÃÄÅ', 'AAAAAA') into v_str; 
     select translate(v_str, 'ÉÈËÊ', 'EEEE') into v_str; 
     select translate(v_str, 'ÌÍÎÏ', 'IIII') into v_str; 
     select translate(v_str, 'ÌÍÎÏ', 'IIII') into v_str; 
     select translate(v_str, 'ÒÓÔÕÖ', 'OOOOO') into v_str; 
     select translate(v_str, 'ÙÚÛÜ', 'UUUU') into v_str; 
     select translate(v_str, 'àáâãäå', 'aaaaaa') into v_str; 
     select translate(v_str, 'èéêë', 'eeee') into v_str; 
     select translate(v_str, 'ìíîï', 'iiii') into v_str; 
     select translate(v_str, 'òóôõö', 'ooooo') into v_str; 
     select translate(v_str, 'ùúûü', 'uuuu') into v_str; 
     select translate(v_str, 'Çç', 'Cc') into v_str; 
     return v_str; 
end;$BODY$ 
    LANGUAGE 'plpgsql' VOLATILE; 

Cả hai chức năng tạo ra các lỗi sau khi tôi chạy tập tin trong NetBeans:

ERROR: unterminated dollar-quoted string at or near "*the string that starts the function*" 

Trả lời

57

Sử dụng mô-đun unaccent đi kèm với PostgreSQL.

somedb=# CREATE EXTENSION unaccent; 
CREATE EXTENSION 
somedb=# SELECT unaccent('Hôtel'); 
unaccent 
---------- 
Hotel 

somedb=# SELECT * FROM table WHERE lower(unaccent(table.id)) = lower('Jose'); 

Và tốc độ mọi thứ lên một chút bằng cách tạo ra một accentless, thấp-cased index:

somedb=# CREATE INDEX CONCURRENTLY ON table (lower(unaccent(id))); 
+3

tạo Index không làm việc, kể từ unaccent không phải là bất biến. – usamec

Các vấn đề liên quan