2015-08-21 2 views
0

Примечания: Я считаю, что это не является не дубликата this seemingly related question, так как у меня есть реальные строки, которые содержат число вместо целых чисел, хранящихся в виде строк, как другой ОП.Collation для естественных порядка строк на числе они содержат

Я ищу способ вывода строк SQL, упорядоченных в натуральном порядке, числом, которое они содержат, как числовой инфикс. Например, Windows Explorer делает это естественно:

screenshot from Windows Explorer

On DBA, я прочитал, что только цифры не имеют свойств для алфавитной сортировки, , но я уверен, что есть некоторые способа сделать это для чисел инфиксных без ведущие нули, потому что они являются значительным.

В SQL Server 2008 R2, мой сценарий примерно так:

DECLARE @Table TABLE (ID INT, Name VARCHAR(10)); 
INSERT INTO @Table (ID, Name) VALUES 
(1,'name1file'), (5,'name11file'), 
(2,'name2file'), (6,'name20file'), 
(3,'name3file'), (7,'name21file'), 
(4,'name10file'); 
SELECT * FROM @Table ORDER BY Name COLLATE Latin1_General_100_BIN ASC; 

Примерные наборы результатов:

Output got   Output desired 
ID | Name   ID | Name 
==========   ========== 
1 | name1file  1 | name1file 
4 | name10file 2 | name2file 
5 | name11file 3 | name3file 
2 | name2file  4 | name10file 
6 | name20file 5 | name11file 
7 | name21file 6 | name20file 
3 | name3file  7 | name21file 

Столбец ID для иллюстративного предназначена только (можно просто ORDER BY ID в том, что дело). Это только запрос запроса VARCHAR. Я попытался использовать COLLATE, но ни один из fn_helpcollations, я попробовал, не получил желаемый заказ.

Итак, есть ли способ добиться того, что без с помощью SUBSTRING или PATINDEX или CLR функции или другое средство извлечения числа, возможно, с использованием соответствующего сортировки?

Если нет, существует ли причина, по которой этот общий вариант использования не применяется ни в одной из тысяч сортировок? Я надеялся, что Windows Explorer использовал для этого общую общую сортировку вместо реализации функции, такой как PHP natsort().

+0

пожалуйста, вы можете дать некоторые оригинальные имена файлов? является префиксом и суффиксом константы числа, как вы указали в примере: «name» и «file». –

+2

У файлов всегда есть имя # формат файла? Если это так, попробуйте 'ORDER BY LEN (Name), Name' – lad2025

+0

Тот же вопрос о PostgreSQL - http://stackoverflow.com/questions/12965463/humanized-or-natural-number-sorting-of-mixed-word-and-number-strings. Ни одно из решений не будет ork на MS SQL без использования CLR. И это не будет быстрым в любом случае ... – Luaan

ответ

2

Если ваши файлы имеют имя в названии формата ### файл, вы можете отсортировать его с помощью

SELECT * FROM @Table ORDER BY LEN(Name), Name

сортировки просто, сортировать по длине имени, то по имени. Ваше имя файла является постоянным и изменяется только номерная часть, поэтому «5», «1» и «2» «до« 10 »по длине. Второй порядок дает правильный порядок между числом в той же величине (0-9) (. 10-99) (100-999) и так далее

Имейте в виду, что он не совершенен общее решение, например:. «г» < «аа»

+0

Строки сохраняют формат, подобный этому, отличаются только числовые части. Ваше решение работает! Ваш ответ может быть дополнительно улучшен путем добавления короткого объяснения _how_ 'LEN' делает магию. – dakab

+0

Это действительно умный, но удивительно простой эвристический, спасибо за это. Он будет тщательно работать по-разному в соответствующем порядке (это естественно), что довольно хорошо. И на самом деле не '' z "<" aa "(<" az "<" aaa "...)'? – dakab

+0

Да "z" <"aa" <"az" <"aaa" <"ccc" <"aaaa" и т. Д. Длина имеет приоритет. – lad2025