Как PostgreSQL упорядочивает текстовые значения? - PullRequest
3 голосов
/ 29 июня 2019

Следующий запрос

SELECT * FROM (VALUES('c'), ('a'), ('b'), ('"a"')) X ORDER BY 1 ASC

производит

a
"a"
b
c

Так почему "a" появляется после a, даже если он начинается с не алфавитного символа (то есть ")?

Я думал, что вывод должен быть

"a"
a
b
c

Кажется, что PostgreSQL удаляет не алфавитные символы при сортировке этих значений, но это не имеет смысла для меня.

Ответы [ 2 ]

3 голосов
/ 29 июня 2019

Поведение сортировки текста (char, varchar, text) зависит от текущей сортировки вашей локали . Попробуйте использовать,

SELECT * 
FROM (VALUES('c'), ('a'), ('b'), ('"a"')) X(col) 
ORDER BY col COLLATE "C" asc;

Сортировка "C" представляет собой побайтное сопоставление , которое игнорирует правила национального языка, кодировку и т. Д.

0 голосов
/ 29 июня 2019

В сопоставлении литерала в конструкторе значений строк VALUES происходит что-то "забавное", но если вы используете "настоящую" таблицу, ваш запрос сортируется, как и ожидалось:

CREATE TABLE T (StringCol VARCHAR(5));
INSERT T Values ('a'),('b'),('c'),('"a"');
SELECT * FROM T ORDER BY 1

Iбросил быстрый взгляд на эту тему , но не смог найти очевидную причину, требуется более тщательное прочтение, но вы должны найти там свой ответ.

HTH

...