Сортировать по алфавиту, цифрам, порядку специальных символов - PullRequest
1 голос
/ 18 июня 2020
    SELECT * FROM details
    ORDER BY cast(SUBSTRING(name,'^[a-zA-Z]+') as varchar) orderDirection NULLS LAST,
    cast(SUBSTRING(name,'^\d+') as numeric) orderDirection NULLS LAST, name orderDirection;

Этот запрос извлекает данные в AS C или DES C в зависимости от ввода, который мы дали для 'orderDirection'. Но проблема в заглавных буквах, и строчные буквы также будут обрабатываться как отдельная сортировка. Так что помогите мне найти правильный запрос с добавлением чего-либо в этот запрос (потому что я использую некоторые общие c коды для его создания)

Текущий результат:

"Came"

"Result"

"Result came"

"came"

"result"

"01 Result"

"# Result"

Ожидаемый результат:

"Came"

"came"

"Result"

"result"

"Result came"

"01 Result"

"# Result"

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Получите последнюю PostgreSQL версию, созданную с использованием последней библиотеки ICU, и создайте собственное сопоставление:

CREATE COLLATION english_weird (
   PROVIDER = 'icu',
   LOCALE = 'en-u-kr-punct-symbol-currency-digit-latn'
);

Затем используйте ее для сортировки:

ORDER BY name COLLATE english_weird DESC

Если вы всегда нужен такой порядок для этого столбца, определяйте его соответственно:

ALTER TABLE details
   ALTER name TYPE text COLLATE english_weird;
1 голос
/ 18 июня 2020

Если преобразовать строки в нижний регистр перед заказом, вы получите желаемый результат:

SELECT * FROM details
ORDER BY cast(SUBSTRING(LOWER(name,'^[a-z]+')) as varchar) DESC NULLS LAST,
         cast(SUBSTRING(name,'^\d+') as numeric) DESC NULLS LAST,
         LOWER(name) DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...