如何在 Postgresql select 查询中找到所有相对重音?

How to find all relative accent in Postgresql select query?

我有一个 table 名为 联系人

 id |       name       
----+------------------
 44 | Aarón  

我正在尝试执行查询:

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

它return(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_collation 列出此排序规则;它就在那里。

完成所有这些后,我再次尝试通过查询获得所有相对口音的结果 'o':

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

但我又得到了 (0 rows)

最终我想要记录 "Aarón" 当我执行上面的查询时。

提前致谢。

您可以使用 postgres 的 unaccent 模块。

为此,您需要在系统中安装 postgresql-contrib。您可以在基于 linux.

的 debian 中使用以下命令安装它
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)

希望对您有所帮助!

扩展 unaccent 是一个很好的解决方案。如果你处理一小组没有连字的字符,你也可以使用一个简单的函数,比如这个用于波兰语的函数:

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

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

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