Установить числовой порядок в столбце SQL Server 2005 varchar, содержащем буквы и цифры? - PullRequest
0 голосов
/ 16 сентября 2008

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

Я хочу заказать их численно, и у меня есть

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

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

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

Ответы [ 5 ]

2 голосов
/ 16 сентября 2008

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

1 голос
/ 17 сентября 2008

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

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

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

0 голосов
/ 29 сентября 2008

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

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

0 голосов
/ 17 сентября 2008

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

Если поле является именем, вы будете использовать символы, а затем вы захотите определить фиксированную длину. Дополните все имена операторов нулями слева. Определите правила именования для операторов (т. Е. Без букв. Или коды, которые вы будете использовать в серии, например "A001")

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

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

0 голосов
/ 16 сентября 2008

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

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

...