Иногда у вас просто нет выбора, хранить числа вместе с текстом. В одном из наших приложений хост веб-сайта, который мы используем для нашего сайта электронной коммерции, динамически создает фильтры из списков. Нет возможности сортировать по любому полю, кроме отображаемого текста. Когда мы хотели создать фильтры на основе списка, в котором говорилось бы такие вещи, как от 2 "до 8" 9 "до 12" 13 "до 15" и т. Д., Нам нужно было отсортировать 2-9-13, а не 13-2-9, как это будет, когда чтение числовых значений. Поэтому я использовал функцию SQL Server Replicate вместе с длиной самого длинного числа, чтобы дополнить любые более короткие числа начальным пробелом. Теперь 20 сортируется после 3 и так далее.
Я работал с представлением, которое давало мне минимальную и максимальную длину, ширину и т. Д. Для типа и класса элемента, и вот пример того, как я делал текст. (LB n Low и LB n High - это нижняя и верхняя границы пяти скобок длины.)
REPLICATE(' ', LEN(LB5Low) - LEN(LB1High)) + CONVERT(NVARCHAR(4), LB1High) + '" and Under' AS L1Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB2Low)) + CONVERT(NVARCHAR(4), LB2Low) + '" to ' + CONVERT(NVARCHAR(4), LB2High) + '"' AS L2Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB3Low)) + CONVERT(NVARCHAR(4), LB3Low) + '" to ' + CONVERT(NVARCHAR(4), LB3High) + '"' AS L3Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB4Low)) + CONVERT(NVARCHAR(4), LB4Low) + '" to ' + CONVERT(NVARCHAR(4), LB4High) + '"' AS L4Text,
CONVERT(NVARCHAR(4), LB5Low) + '" and Over' AS L5Text