2010-07-20 2 views
0

Я хочу сделать order by материал, используя часть некоторого column.For например, некоторые записи столбца user выглядеть, как показано нижеКак сделать заказ по столбцу?

vip1,vip2,vip21,vip10,vip100 

Если я делаю order by user, заказ будет

vip1,vip10,vip100,vip2,vip21 

Тогда как я могу сделать результат следующим

vip1,vip2,vip10,vip21,vip100 

Спасибо.

ответ

1

Какие РСУБД?

Для SQL Server, чтобы получить числовую сортировку, а не лексикографической сортировку было бы что-то вроде

ORDER BY CAST(RIGHT(col, LEN(col)-3) AS INT) 

Для MySQL

ORDER BY CAST(RIGHT(col, LENGTH(col)-3) AS UNSIGNED) 

но почему вы хранение vip части вообще, если это одинаково для всех строк?

+0

Да, это точка. Но таблицы разработаны другими, так что мало что можно сделать. :( – Young

1

Вы также можете заменить имя пользователя ('vip') ничем ('') и добавить ноль, а затем сортировать. Не более эффективный, просто более общий.

1

Является ли «префикс» частью ровно 3 символа? Если нет, это осложняется. Umm, с Postgres вы могли бы

order by regexp_matches(userid,"^[a-z]*")[1], substring(userid, regexp_matches(userid,"^[a-z]*")[1])::int 

Я думаю, что это сработало, я не пробовал. Во всяком случае, дело в том, что если у вас есть какая-то функция, которая будет выполнять регулярные выражения, вы удаляете ведущую строку альфа, а затем удаляете оставшиеся и конвертируете ее в int.

Если вы действительно внедряете число в альфа-поле, лучшей альтернативой является: Не делайте этого. Если это два разных элемента логических данных, сделайте два поля. Сложнее складывать поля, чем разделять их.

+0

Хорошие предложения. Спасибо. – Young

Смежные вопросы