У меня есть база данных со столбцом VARCHAR, который содержит целые числа различной длины. Я хочу отсортировать их так, чтобы 10 приходилось после 9, а не 1, а 70A приходилось после 70. Я смог сделать это с помощью операторов PATINDEX () , CTE и CASE в предложении WHERE.
Тем не менее, мне было интересно, если бы было сопоставление, где это было бы ненужным.
sql-server
collation
sorting
natural-sort
Джастин Даринг
источник
источник
Ответы:
Нет. Сортировка - это сортировка по алфавиту, в зависимости от кодовой страницы, акцента, регистра, ширины, кана. Числа символов (0-9) не имеют ни одного из этих свойств.
Так
9
всегда после того, как10B
в любом роде.Вы должны разделить это, как вы заметили,
или отсортировать так:Длина справа определяет, сколько пробелов у вас есть.Вы могли бы, конечно:
Правильно обоснуйте в char (сохраненная версия моего RIGHT выше)Последние 2 предложения похожи на мои права выше и немного отличаются. Быстрая сортировка (не требуется обработка colukmn), но требуется больше места для хранения
источник
9
всегда10B
в любом виде. ": Так обстоят дела только в SQL Server, потому что базовый параметр сортировки для обработки "DigitsAsNumbers" не был представлен как параметр сортировки. Еще ;-). Это стало доступно для приложений на базе Windows, начиная с Windows 7, особенно в проводнике. И однажды он может быть открыт для SQL Server, если достаточно людей поддержит эту идею. Я попытался добиться успеха, представив следующее предложение Connect: Поддержка "естественной сортировки" / DIGITSASNUMBERS в качестве параметра сортировки .Я бы установил вычисляемый столбец, а затем отсортировал на основе этого. Что-то вроде
Затем используйте этот столбец для сортировки, поскольку теперь вы можете индексировать столбец.
источник
Если вам нужен болезненный способ доказать, что говорит @gbn (по сути, вы не можете сказать, что сопоставление упорядочивает подстроки по-разному), вы можете создать быструю таблицу #temp, которая имеет коэффициент для ожидаемого порядка, и посмотреть, упорядочение по любому сопоставлению возвращает тот же порядок:
Это выполняется для меня примерно за 10 секунд и дает 0 строк - это означает, что никакие параметры сортировки, доступные для SQL Server (по крайней мере 2008 R2, еще не пробовали Denali), будут отсортированы так, как вы ожидаете. Вам нужен другой способ определения сортировки.
источник
Хотите разумный, эффективный способ сортировки чисел в строках как фактические числа? Рассмотрите возможность голосования за мое предложение Microsoft Connect: поддержка «естественной сортировки» / DIGITSASNUMBERS в качестве параметра сортировки
Хотя этот вопрос относится к SQL Server, а этот ответ - нет, я решил, что мне все же следует публиковать эту информацию, просто чтобы повысить ее осведомленность и не противостоять каким-либо другим ответам.
При этом за пределами SQL Server в некоторых средах возможна сортировка такого типа. Это то, что по крайней мере указано в документации Unicode. В UNICODE LOCALE DATA MARKUP LANGUAGE (LDML) ЧАСТЬ 5: стандарт / отчет COLLATION имеется диаграмма для параметров сортировки, которая описывает различные варианты настройки поведения сортировки. Одним из вариантов является
-kn-true
или[numericOrdering on]
:Однако этот документ является «техническим стандартом», а не частью базовой спецификации Unicode. Примечание в верхней части документа гласит:
Следовательно, это конкретное поведение недоступно в SQL Server или даже в .NET (по крайней мере, изначально), хотя оба они соответствуют базовой спецификации Unicode.
Проект ICU (International Components for Unicode) представляет собой набор библиотек C / C ++ и Java, которые реализуют эту функциональность, и даже есть онлайн-демонстрация. А в разделе «связанные проекты» есть ссылка на проект .NET, который, по-видимому, является оберткой COM-объекта для библиотеки ICU, что позволило бы раскрыть эту функциональность для управляемого кода. Но не ясно, если этот .NET проект все еще активен.
Но чтобы увидеть это поведение в действии, перейдите к демонстрации сортировки ICU .
Вставьте следующее в область ввода текста с левой стороны:
Установите все параметры на «по умолчанию». Отметьте опцию «Ввод номеров строк» справа от sortкнопки и убедитесь, что опция «Прочность разрядов» не отмечена.
Нажмите на sortкнопку, и вы должны получить следующее:
Это то, что следует ожидать при выполнении типичной сортировки строк, и то, что вы видите в SQL Server.
Теперь в ряду переключателей чуть выше sortкнопки второй ряд помечен как «числовой». Выберите переключатель «вкл».
Нажмите sortкнопку еще раз, и вы должны получить следующее:
Опрос, если это работает, когда числовая часть находится в середине строки? Хорошо, вставьте следующее в область ввода текста с левой стороны (заменив предыдущий список):
Убедитесь, что для числовой настройки все еще установлено значение «вкл». Нажмите sortкнопку еще раз, и вы должны получить следующее:
Хотите увидеть это в другом месте? Создайте на жестком диске папку, например, C: \ temp \ sorting \ , и создайте пустые файлы с теми же именами «Script -...». Сделайте
DIR
в окне команды, и вы увидите стандартную сортировку. Но при просмотре списка файлов в проводнике Windows вы увидите список, отсортированный с использованием параметра «числовой» :-).источник