2012-11-28 21 views
15

Olası Çoğalt aksan kaldırmak için: Bir onları yok sayar SEÇ yapmak zaman çok vurgular kaldırmak çalışıyorum
Does PostgreSQL support “accent insensitive” collations?Fonksiyon postgreSQL

.

Örnek:

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

O döndürür: Böyle

José 
Jose 
Jósé 
Jóse 

falan.

Bu işlevleri buldum ve işe yaramazlar, Struts 1.X kullanıyorum gerçeği olabileceğini düşünüyorum, lütfen onları kontrol edin ve nerede yanlış olduğumu veya başka hangi işlevi yapmalıyım? kullanın.

İLK İŞLEVİ

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; 

İKİNCİ İŞLEVİ

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; 

Ben NetBeans dosyayı çalıştırdığınızda Her iki fonksiyon aşağıdaki hata oluşturmak:

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

cevap

57

PostgreSQL ile birlikte gelen unaccent modülünü kullanın. unaccent değişmez olmadığından,

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

Endeksi oluşturma çalışmaz: Bir accentless üreterek

somedb=# CREATE EXTENSION unaccent; CREATE EXTENSION somedb=# SELECT unaccent('Hôtel'); unaccent ---------- Hotel somedb=# SELECT * FROM table WHERE lower(unaccent(table.id)) = lower('Jose'); 

Ve hız şeyler kadar biraz endeks alt kasalı. – usamec