MySQL заказ STRING как INT и вставка - PullRequest
2 голосов
/ 19 ноября 2011

У меня есть такой набор данных:

print_id
--------
2b
1
2
4b
4a
3
6
2a
5

Идентификатор печати может быть в формате: / ([0-9] +) ([ae] {1})? /

Я хочу заказать их сначала по номеру, а по буквам, если они есть.Если буквы нет, то это первая позиция в этом номере.Таким образом, результат должен выглядеть примерно так:

print_id
--------
1
2
2a
2b
3
4a
4b
5
6

Я пробовал ORDER BY (print_id + 0), он сортирует числа правильно, но это не совсем помогает.Есть предложения?

Ответы [ 2 ]

3 голосов
/ 19 ноября 2011

Вы можете иметь несколько выражений в предложении ORDER BY:

ORDER BY print_id + 0, print_id

Сначала попытается упорядочить их численно (без учета буквенного суффикса), а если они численно эквивалентны, упорядочит их по строковым значениям (включая буквенный суффикс). Для правила, которое вы описали, единственный раз, когда это нарушится, это если у вас есть ведущие нули; например, это ORDER BY предложение будет сортировать '01b' выше '1a'. Может ли это произойти в ваших данных?

0 голосов
/ 19 ноября 2011
ORDER BY print_id

должен делать то, что вы хотите. Он будет упорядочен по символьному полю print_id, что эквивалентно упорядочению по отдельным символам.

Итак, для стола

print_id
--------
1
3a
3c
2b
2c
2a
3b
0
0b
00

Вы получите

print_id
--------
0
00
0b
1
2a
2b
2c
3a
3b
3c
...