Хотя этот вопрос относится к SQL Server, а этот ответ - нет, я решил, что мне все же следует публиковать эту информацию, просто чтобы повысить ее осведомленность и не противостоять каким-либо другим ответам.
При этом за пределами SQL Server в некоторых средах возможна сортировка такого типа. Это то, что по крайней мере указано в документации Unicode. В UNICODE LOCALE DATA MARKUP LANGUAGE (LDML) ЧАСТЬ 5: стандарт / отчет COLLATION имеется диаграмма для параметров сортировки, которая описывает различные варианты настройки поведения сортировки. Одним из вариантов является -kn-true
или [numericOrdering on]
:
Если установлено значение on , любая последовательность десятичных цифр (General_Category = Nd в [ UAX44 ]) сортируется на первичном уровне с ее числовым значением. Например, «А-21» <«А-123». Все вычисленные первичные веса находятся в начале группы переупорядочения цифр . Таким образом, с таблицей UCA, "a $" <"a0" <"a2" <"a12" <"a⓪" <"aa".
Однако этот документ является «техническим стандартом», а не частью базовой спецификации Unicode. Примечание в верхней части документа гласит:
Технический стандарт Unicode (UTS) является независимой спецификацией. Соответствие стандарту Unicode не подразумевает соответствия любому UTS.
Следовательно, это конкретное поведение недоступно в SQL Server или даже в .NET (по крайней мере, изначально), хотя оба они соответствуют базовой спецификации Unicode.
Проект ICU (International Components for Unicode) представляет собой набор библиотек C / C ++ и Java, которые реализуют эту функциональность, и даже есть онлайн-демонстрация. А в разделе «связанные проекты» есть ссылка на проект .NET, который, по-видимому, является оберткой COM-объекта для библиотеки ICU, что позволило бы раскрыть эту функциональность для управляемого кода. Но не ясно, если этот .NET проект все еще активен.
Но чтобы увидеть это поведение в действии, перейдите к демонстрации сортировки ICU .
Вставьте следующее в область ввода текста с левой стороны:
1
2
10B
6
11
10A
3
10
Установите все параметры на «по умолчанию». Отметьте опцию «Ввод номеров строк» справа от sortкнопки и убедитесь, что опция «Прочность разрядов» не отмечена.
Нажмите на sortкнопку, и вы должны получить следующее:
[1] 1
[8] 10
[6] 10A
[3] 10B
[5] 11
[2] 2
[7] 3
[4] 6
Это то, что следует ожидать при выполнении типичной сортировки строк, и то, что вы видите в SQL Server.
Теперь в ряду переключателей чуть выше sortкнопки второй ряд помечен как «числовой». Выберите переключатель «вкл».
Нажмите sortкнопку еще раз, и вы должны получить следующее:
[1] 1
[2] 2
[7] 3
[4] 6
[8] 10
[6] 10A
[3] 10B
[5] 11
Опрос, если это работает, когда числовая часть находится в середине строки? Хорошо, вставьте следующее в область ввода текста с левой стороны (заменив предыдущий список):
Script - 1.sql
Script - 2.sql
Script - 10B.sql
Script - 6.sql
Script - 11.sql
Script - 10A.sql
Script - 3.sql
Script - 10.sql
Убедитесь, что для числовой настройки все еще установлено значение «вкл». Нажмите sortкнопку еще раз, и вы должны получить следующее:
[1] Script - 1.sql
[2] Script - 2.sql
[7] Script - 3.sql
[4] Script - 6.sql
[8] Script - 10.sql
[6] Script - 10A.sql
[3] Script - 10B.sql
[5] Script - 11.sql
Хотите увидеть это в другом месте? Создайте на жестком диске папку, например, C: \ temp \ sorting \ , и создайте пустые файлы с теми же именами «Script -...». Сделайте DIR
в окне команды, и вы увидите стандартную сортировку. Но при просмотре списка файлов в проводнике Windows вы увидите список, отсортированный с использованием параметра «числовой» :-).