在postgreSQL中删除重音的功能 [英] Function to remove accents in postgreSQL

查看:247
本文介绍了在postgreSQL中删除重音的功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


可能重复:

PostgreSQL支持不区分重音排序规则吗?


我试图删除重音符号,所以当我做一个 SELECT 时忽略它们。



示例:

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

它返回:

 José
Jose
Jósé

或类似的东西。



我发现了这些函数并且他们不工作,我想这可能是我使用Struts 1.X的事实,请检查出来并告诉我我错在哪里或应该使用哪些其他功能。

 创建或替换函数unaccent_string(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;
$$语言plpgql;

第二个功能

  CREATE OR REPLACE FUNCTION norm_text_latin(字符变化)
RETURNS字符变化AS
$ BODY $
declare
p_str别名为$ 1;
v_str varchar;
begin
将转换(p_str,'ÀÁÃÃ','AAAAAA')转换为v_str;
选择翻译(v_str,'ÉÈËÊ','EEEE')到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;
选择translate(v_str,'iîî','iiii')到v_str;
选择translate(v_str,'òóôö','ooooo')到v_str;
select translate(v_str,'ùúûü','uuuu')into v_str;
选择翻译(v_str,'Çç','Cc')到v_str;
返回v_str;
end; $ BODY $
LANGUAGE'plpgsql'VOLATILE;

当我在NetBeans中运行文件时,这两个函数都会产生以下错误:

 错误:没有终止美元引用的字符串在或接近*启动函数的字符串*


解决方案

使用 unaccent 模块,它附带PostgreSQL。

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

somedb =#SELECT * FROM table WHERE lower(unaccent(table.id))=下( '圣何塞');

通过生成一个无重音,低分辨率的索引来提高速度:

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


Possible Duplicate:
Does PostgreSQL support "accent insensitive" collations?

I'm trying to remove the accents so when I make a SELECT it ignores them.

Example:

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

It returns:

José
Jose
Jósé
Jóse

or something like that.

I found these functions and they wont work, I'm thinking it may be the fact that I'm using Struts 1.X, please check them out and tell me where I'm wrong or what other function should I use.

FIRST FUNCTION

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;

SECOND FUNCTION

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; 

Both functions generate the following error when I run the file in NetBeans:

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

解决方案

Use the unaccent module that ships with 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');

And speed things up a bit by generating an accentless, lower-cased index:

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

这篇关于在postgreSQL中删除重音的功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆