У меня есть столбец, содержащий строки «Оператор (1)» и так далее, пока «Оператор (600)».
Я хочу получить их числовой заказ, и я придумал
select colname from table order by
cast(replace(replace(colname,'Operator (',''),')','') as int)
что очень-очень некрасиво.
Лучшие предложения?


Это то, что InStr () / SubString (), меняя Operator (1) на Operator (001), сохраняя n в Operator (n) отдельно или создавая вычисляемый столбец, который скрывает уродливые манипуляции со строкой. То, что у вас есть, кажется прекрасным.
Мой ответ - изменить проблему. Я бы добавил в таблицу поле operatorNumber, если это возможно. Измените процедуры обновления / вставки, чтобы извлечь номер и сохранить его. Таким образом, преобразование строки выполняется только один раз на запись.
Логика упорядочивания требует преобразования строки при каждом запуске запроса.
Итак, сначала определите значение этого столбца. Оператор - это имя, чтобы вы могли оправдать использование символов? Или это число?
Если поле является именем, вы будете использовать символы, а затем захотите определить фиксированную длину. Заполните все имена операторов нулями слева. Определите правила именования для операторов (например, без букв. Или коды, которые вы использовали бы в серии, например "A001")
Индекс сортирует физические данные на сервере. А правильно определенное именование текста отсортирует их по запросу. Вам нужно и то, и другое.
Если оператор является числом, значит, вы неправильно указали тип данных для этого столбца и его необходимо изменить.
Если вы действительно имеют, чтобы оставить данные в том формате, который у вас есть - и добавление числового столбца порядка сортировки является лучшим решением, - тогда подумайте о переносе манипуляции с текстом в пользовательскую функцию.
выберите имя столбца из порядка таблицы по dbo.udfSortOperator (имя столбца)
Это менее уродливо и дает некоторую абстракцию. При вызове функции возникают дополнительные накладные расходы, но для таблицы, содержащей несколько тысяч строк на не слишком сильно пострадавшем сервере базы данных, это не является серьезной проблемой. Сделайте пометки в функции, чтобы при необходимости оптимизировать ее позже.
Индексированный вычисляемый столбец
Если вы часто заказываете столбец operator или иным образом запрашиваете его, рассмотрите возможность создания вычисляемого столбца для его числового значения и добавления для него индекса. Это даст вам вычисляемый / постоянный столбец (который звучит как оксюморон, но это не так).