在PostgreSQL 12+中,可以使用不确定的ICU归类来实现不区分重音的搜索 (see this StackOverflow answer).

我想实现accent insensitive search,同时仍然使用accent sensitive sorting.


Consider the following example:

我有一个名为Country_Region的表,其中只有一列:"Symbol".它存储以下值:

  • 鲁布斯基
  • 兹基
  • MałPolskie

这些值已按预期顺序列出,因为波兰字母顺序是L->Ł->M.

下面的SQL查询应该返回"兹基"字段,忽略变音符号:

SELECT * FROM country_region WHERE symbol = 'lodzkie'

下面的SQL查询应该返回按字母表(鲁布斯基->兹基->MałPolskie)排序的值:

SELECT * FROM country_region ORDER BY symbol

What I have tried

我试过使用两个不同的ICU地点.

在下面的归类中,Unicode区域设置搜索按预期工作,但行的排序顺序错误:

CREATE COLLATION ignore_accent (provider = icu, locale = 'und-u-ks-level1-kc-true', deterministic = FALSE);
CREATE INDEX test_index ON country_region(symbol COLLATE ignore_accent);

在下面的排序规则中,波兰语区域设置排序按预期工作,但在搜索中不会忽略变音符号:

CREATE COLLATION ignore_accent (provider = icu, locale = 'pl-u-ks-level1-kc-true', deterministic = FALSE);
CREATE INDEX test_index ON country_region(symbol COLLATE ignore_accent);

有没有可能用PostgreSQL解决这个问题?提前谢谢!

推荐答案

我要说的是,这是波兰校对定义中的一个ICU漏洞.在他们的错误数据库中进行网络搜索,得到this个链接,链接到that,似乎是开放的,但我不确定这是不是你遇到的问题.

作为一种解决办法,您可以使用正常的确定性排序规则"pl-PL-x-icu"来定义列,并在相等比较中明确说明排序规则:

CREATE COLLATION ignore_accent (
   provider = icu,
   locale = 'und-u-ks-level1-kc-true',
   deterministic = FALSE
);

CREATE INDEX test_index ON country_region(symbol COLLATE ignore_accent);

SELECT * FROM country_region WHERE symbol COLLATE ignore_accent = 'lodzkie';

对于所有其他目的,正常的排序规则也可以.

Sql相关问答推荐

表名数组

将SEMI JOIN、ANTI JOIN转换为非连接SQL

如何连接第二个表并将其内容输入到第一个表的单个字段中?

按分隔符和总和分析字符串

查找表中特定值的上次更新日期

在SQL中为两个日期之间的每个日期添加行

使用多个嵌套数组查询JSON数据

关于Postgres横向联接的谓词

我可以在SQLite3中使用BLOB作为主键吗?

如何在 SNOSQL 中执行反连接(或 where 子句过滤)以查找字段不包含另一个表中的值的行?

将 jsonb 数组中的对象取消嵌套到单独的行中

如何修复初学者 SQL INNER JOIN 查询错误

在 SQL Server 中合并两个 XML 列

Select 一个非零值减少重复

SQL Server - 复杂场景 - 比较状态并填充值到后续行

snowflake中的动态文件名生成

如何在 case 语句中使用聚合?

Postgres存在限制问题「小值」

Athena:从字符串birth_dt列计算年龄

Oracle SQL 查询自行运行,但在包装到select count(*) from ()时失败