За последние пару дней я пытался отсортировать список буквенно-цифровых символов в натуральном порядке. Я обнаружил, что использование опции NLS_SORT может упорядочить список правильно (see this answer) , Но, опробовав это решение, я обнаружил, что это не имеет никакого значения. Список по-прежнему отображался как с обычным запросом ORDER BY. Пожалуйста, не то, что solution involving regex не является для меня вариантом.Двоичный сортировка по алфавитно-цифровому тексту не ведет себя как натуральный вид
Для тестирования я сделал таблицу и заполнил ее некоторыми данными. При запуске SELECT name FROM test ORDER BY name ASC
я получаю следующий результат:
Как вы видите упорядочение неестественно. Это должно быть больше похоже на 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
.
Решения, которые я пробовал, включали настройку параметра nls_sort.
ALTER SESSION SET nls_sort='BINARY'; -- or BINARY_AI
SELECT name FROM test ORDER BY NLSSORT(name,'NLS_SORT=BINARY') -- or BINARY_AI
Он должен заказать текст в списке на основе десятичного кода каждого символа, как указано в ASCII table. Поэтому я ожидал, что он окажется правильным (так как порядок в этой таблице - «пробел», «точка», цифры, буквы), но ничего не изменило. Порядок все тот же, что и на изображении.
Если BINARY, то порядок сортировки на основе числового значения каждого символа, так что это зависит от характера базы данных установить
Это может иметь что-то делать с набором символов I» м, но я не уверен, что с ним не так. Запуск SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET';
дает мне значение AL32UTF8
. Который кажется немного расширенной версией UTF8 (исправьте меня, если я ошибаюсь). Я работаю на базе Oracle версии 11.2.0.4.0.
Так может ли кто-нибудь сказать мне, что я делаю неправильно или что мне не хватает?
Заранее спасибо.
Почему это естественно для того, чтобы быть 1,2,3, ..., а не 1,10,100? Он смотрит на строковый символ по символу (по существу), поэтому он * правильно помещает '1.' перед' 10'. Значение второго символа не влияет на сортировку первого символа. Посмотрите на строку этого 'nlssort (name)' return. Почему не является регулярным выражением? –
С точки зрения программного обеспечения это нормально. Но я имел в виду «нормальную» сортировку по понятным для человека способом (извините, должен был это сказать). Возьмем, к примеру, проводник Windows. Когда вы сортируете файлы, содержащие число, которое действует как версия этого файла, я ожидаю, что самая высокая версия будет в нижней части списка, когда я сортирую по возрастанию (или сверху при использовании нисходящего порядка). –