2013-06-27 3 views
2

Может кто-нибудь одолжить мне руку, что я должен добавить к моему ORDER BY заявление сортировать эти значения естественно:Natural Сортировка SQL ORDER BY

1 
10 
2 
22 
20405-109 
20405-101 
20404-100 
X 
Z 
D 

В идеале я хотел бы что-то вдоль линий:

1 
2 
10 
22 
20404-100 
20405-101 
20405-109 
D 
X 
Z 

настоящее время я использую:

ORDER BY t.property, l.unit_number 

где значения l.unit_number

Я пробовал делать l.unit_number * 1 и l.unit_number + 0, но они не сработали.

Должен ли я делать вид ORDER условным, например Case When IsNumeric(l.unit_number)?

спасибо.

+1

Как вы можете ожидать '20405-109' и' x' лечиться? – Aiias

+0

Я добавил желаемый результат. Извиняется. Знал, я кое-что забыл. – tr3online

+0

20405-109 может быть зашифрован и прибыть до или после Альфы. Это очень мягко. Я просто хочу, чтобы все было правильно. 1-> 2-> 3-> 10-> 11-> 20-> 21, A-> B-> C-> D и т. Д. – tr3online

ответ

7

Это будет делать это:

SELECT value 
FROM Table1 
ORDER BY value REGEXP '^[A-Za-z]+$' 
     ,CAST(value as SIGNED INTEGER) 
     ,CAST(REPLACE(value,'-','')AS SIGNED INTEGER) 
     ,value 

В 4 уровне the ORDER BY:

  1. REGEXP присваивает любой альфа линию A 1 и не относящиеся к альфам A 0
  2. SIGNED INT сортирует все из чисел частью, предшествующей тире.
  3. SIGNED INT после удаления тире сортирует любые предметы с тем же значением перед тире на части после тире. Потенциально может заменить номер 2, но не хотел бы рассматривать 90-1 так же, как 9-01, если это возникнет.
  4. Сортирует буквы по алфавиту.

Демо: SQL Fiddle

+0

Ничего себе, это работает удивительно хорошо. Спасибо! Я никогда не делал сложного ORDER BY, это даст мне возможность подумать – tr3online