2

从事数据库从 Oracle 到 Postgres 的迁移。我正在尝试在我的应用程序中实现排序行为,其中以数字开头的字母数字标签需要出现在字母之后(在下面的示例中进行了说明)。

我在 Postgres 中尝试了法语排序规则,但无法达到我在 Oracle 中使用NLS_SORT "french".

发布 Oracle 查询,我需要 Postgres 中的等效项,可以在 DB 中设置一次,以便应用程序以后使用它。

甲骨文:

ALTER SESSION SET NLS_SORT='FRENCH';
ALTER SESSION SET NLS_COMP=LINGUISTIC;
select LABEL from CARBON order by LABEL ;

 LABEL
    APPLE
    BALL
    102C
    108C
    108D

Postgres:

我尝试通过创建frenchpg_collation条目命名的排序规则fr-FR-x-icu并使用 pgAdmin GUI 更改现有表列,如下所示:

label character varying(255) COLLATE public.french NOT NULL

不走运,我得到了同样的结果。

select LABEL from CARBON order by LABEL ;

LABEL
102C
108C
108D
APPLE
BALL

我也在 Postgres 中尝试了以下查询,它给出了与上面相同的结果。我在 Postgres 中遗漏了什么吗?

select LABEL from CARBON order by LABEL collate "fr_FR"
4

1 回答 1

2

您可以通过创建自定义 ICU 排序规则(可从 PostgreSQL v10 开始)轻松解决该问题,该排序规则对大于拉丁字符的数字进行排序:

CREATE COLLATION weird (
   LOCALE = 'fr-u-kr-latn-digit',
   PROVIDER = 'icu'
);

ALTER TABLE carbon ALTER label TYPE text COLLATE weird;

SELECT * FROM carbon ORDER BY label COLLATE weird;

 label 
-------
 APPLE
 BALL
 102C
 108C
 108D
(5 rows)

这假设一个最近的 ICU 库,旧版本有一些不同的语法。

对于旧版本的 ICU 库,您可能必须使用

CREATE COLLATION digitslast (
   PROVIDER = 'icu',
   LOCALE = 'fr@colReorder=latn-digit'
);
于 2020-05-12T16:12:44.020 回答