Принудительно упорядочить числовые значения в столбце varchar SQL Server 2005, содержащем буквы и цифры?

StackOverflow https://stackoverflow.com/questions/75361

  •  09-06-2019
  •  | 
  •  

Вопрос

У меня есть столбец, содержащий строки «Оператор (1)» и так далее, пока не будет «Оператор (600)».

Я хочу упорядочить их по номерам, и я придумал

select colname from table order by 
cast(replace(replace(colname,'Operator (',''),')','') as int)

что очень-очень некрасиво.

Лучшие предложения?

Это было полезно?

Решение

Это InStr()/SubString(), замена Оператора(1) на Оператор(001), сохранение n в Операторе(n) отдельно или создание вычисляемого столбца, который скрывает уродливые манипуляции со строками.То, что у вас есть, кажется в порядке.

Другие советы

Если ты действительно иметь чтобы оставить данные в том формате, который у вас есть (и добавление столбца числового порядка сортировки является лучшим решением), тогда рассмотрите возможность переноса текстовых манипуляций в определяемую пользователем функцию.

выберите имя столбца из порядка таблицы с помощью dbo.udfSortOperator(colname)

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

Мой ответ — изменить проблему.Я бы добавил в таблицу полеoperatorNumber, если это возможно.Измените процедуры обновления/вставки, чтобы извлечь номер и сохранить его.Таким образом, попадание преобразования строки происходит только один раз для каждой записи.

Логика упорядочивания потребует преобразования строк каждый раз при выполнении запроса.

Что ж, сначала определите значение этого столбца.Является ли оператор именем, чтобы можно было оправдать использование символов?Или это номер?

Если поле представляет собой имя, вы будете использовать символы и затем захотите определить фиксированную длину.Дополните все имена операторов нулями слева.Определите правила именования для операторов (т.Никаких букв.Или коды, которые вы бы использовали в серии типа «А001»)

Индекс будет сортировать физические данные на сервере.И правильно определенное именование текста будет сортировать их по запросу.Вы хотели бы обоих.

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

Индексированный вычисляемый столбец

Если вы заказываете или иным образом задаете вопросы operator Часто используйте столбец, рассмотрите возможность создания вычисляемого столбца для его числового значения и добавления для него индекса.Это даст вам вычисляемый/постоянный столбец (звучит как оксюморон, но это не так).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top