如何在Postgresql选择查询中查找所有相对重音?

时间:2016-12-14 08:15:07

标签: postgresql collation odoo

我有一个名为联系人

的表格
 id |       name       
----+------------------
 44 | Aarón  

我正在尝试执行查询:

select id,name from contacts where name ilike 'Aaro%';

返回(0 rows)

我正在尝试搜索“ o ”,并且期望结果包括“ o ”的所有重音,例如“ó”。 正如我已经做了一些谷歌搜索和stackoverlfowing我发现使用区域设置我需要安装排序规则。 所以我通过

在linux中安装了排序规则
sudo locale-gen --no-archive de_DE.utf-8

之后我尝试在postgresql数据库中安装排序规则。

create collation de (LOCALE='de_DE.utf-8');

校对生成成功。我试图通过使用select * from pg_collat​​ion列出这个排序规则;它就在那里。

完成所有这些后,我再次尝试通过查询得到所有相对重音“o”的结果:

select id,name from contacts where name ilike 'Aaro%';

但我又得到了(0 rows)

当我执行上述查询时,我想要记录“Aarón”。

先谢谢。

2 个答案:

答案 0 :(得分:3)

您可以使用postgres的unaccent模块。

为此你需要在你的系统中安装postgresql-contrib。你可以在debian linux中使用下面的命令安装它。

sudo apt-get install postgresql-contrib

之后你可以在postgres中创建unaccent。

postgres_db=# create EXTENSION unaccent;
CREATE EXTENSION
postgres_db=# select name from test where unaccent(name) ilike 'Aaro%';
 name  
-------
 Aarón
(1 row)

希望这有帮助!

答案 1 :(得分:1)

扩展程序unaccent是一个很好的解决方案。如果你处理一小部分没有连字的字符,你可以使用像这样的简单函数进行波兰语:

create or replace function unaccent_pl(text)
returns text language sql immutable as $$
    select translate($1, 'ąćęłńóśźżĄĆĘŁŃÓŚŹŻ', 'acelnoszzACELNOSZZ')
$$;

select unaccent_pl('Zażółć gęślą jaźń');

    unaccent_pl    
-------------------
 Zazolc gesla jazn
(1 row)