Эквивалент Oracle nls_sort в postgres

Работаем над миграцией БД с Oracle на Postgres. Я пытаюсь добиться такого поведения сортировки в своем приложении, где буквенно-цифровая метка, начинающаяся с цифр, должна стоять после букв (как описано в примере ниже).

Я попробовал французскую сортировку в Postgres, но не смог добиться того же результата, который получил в Oracle, используя NLS_SORT "french".

Отправляя запросы Oracle, мне нужен эквивалент в Postgres, который можно установить в БД один раз, чтобы приложение впоследствии использовало его.

Оракул:

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:

Я попытался создать сопоставление с именем french из pg_collation вход fr-FR-x-icu и измените существующий столбец таблицы с помощью графического интерфейса pgAdmin следующим образом:

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"

1 ответ

Вы можете легко решить эту проблему, создав настраиваемую сортировку 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'
);
Другие вопросы по тегам