Есть несколько способов сделать это:
- Сохраните их как числовые значения, а не как строки.Вы уже обесценили это, поскольку хотите сохранить строки типа
00100
без изменений с ведущими нулями. - Упорядочение по строкам, приведенным как числовые.Это будет работать, но имейте в виду, что это убийца производительности для баз данных приличного размера.Функции для каждой строки не очень хорошо масштабируются.
- Добавьте третий столбец, который является числовым эквивалентом строки и индекса для этого.Затем используйте триггер
insert
/ update
, чтобы убедиться, что он установлен правильно при изменении строкового столбца.
Поскольку подавляющее большинство баз данных читается гораздо чаще, чем записывается, этот третий вариант выше амортизируетстоимость расчета (сделанная на insert
/ update
) для всех вариантов.Ваши выборы будут ослепительно быстрыми, так как они используют числовой столбец для заказа (а не функции для каждой строки).
Ваши вставки и обновления будут медленнее, но это цена, которую вы платите, и, честно говоря, это хорошостоит заплатить.
Использование триггера поддерживает свойства таблицы ACID, поскольку два столбца находятся в шаге.И это общеизвестная идиома: обычно при оптимизации производительности вы можете обменять пространство на время.
Мы использовали этот «трюк» во многих ситуациях, таких как хранение версий фамилий в нижнем регистре вместе соригиналы (вместо использования чего-то вроде tolower
), длины идентифицирующих строк для поиска всех пользователей с 7-символьными (вместо использования len
) и т. д.
Имейте в виду, что это нормальновернуться к третьей нормальной форме для выполнения, если вы понимаете (и смягчаете) последствия.