#sql #sql-server
#sql #sql-сервер
Вопрос:
Из-за нехватки средств (до тех пор, пока подписки не будут приняты снова) мы не можем заплатить разработчику за исправление способа отображения результатов в некоторых запросах / поисковых запросах.
Что происходит в этих случаях, так это то, что порядок, в котором хранятся строки, отображается для пользователя.
Требование в качестве промежуточного — выполните буквенно-цифровое изменение порядка таблицы результатов таким образом, чтобы позиции каждого четного были в алфавитно-цифровом порядке от 1 до 10, затем 11 и более крупные цифры ниже, за которыми следуют буквы алфавита.
Это пример того, как это может проявляться
Pos Name Event
-------------------
7 Grey Javelin
8 Hill Javelin
9 Jones Javelin
C Norris Javelin
1 Adams Javelin
10 Kirk Javelin
11 Lewis Javelin
12 Moore Javelin
2 Bevan Javelin
3 Cain Javelin
4 Douglas Javelin
5 Evans Javelin
6 Fell Javelin
C Owens Javelin
D Pick Javelin
F Quill Javelin
Правильный порядок должен быть следующим
Pos Name Event
-------------------
1 Adams Javelin
2 Bevan Javelin
3 Cain Javelin
4 Douglas Javelin
5 Evans Javelin
6 Fell Javelin
7 Grey Javelin
8 Hill Javelin
9 Jones Javelin
10 Kirk Javelin
11 Lewis Javelin
12 Moore Javelin
C Norris Javelin
C Owens Javelin
D Pick Javelin
F Quill Javelin
Хотя это не идеально, мне было интересно, есть ли у кого-нибудь простой способ изменить порядок. Я был бы не против, если бы это было помещено в другую таблицу как часть процесса.
Ответ №1:
Это ситуация, когда вы хотите использовать try_convert()
/ try_cast()
:
order by (case when try_convert(int, pos) is not null then 1 else 2 end),
try_convert(int, pos),
pos
В первом случае числа ставятся первыми. Второй порядок по номеру. Третий упорядочивает все остальное.
Я настоятельно советую вам не использовать isnumeric()
. В нем есть забавные аномалии, такие как факт '-'
и '.'
возврат «true».
Ответ №2:
Столбец Pos кажется буквенно-цифровым, поэтому числа не будут сортироваться по значению.
Попробуйте ниже
SELECT Pos,Name,Event
FROM (
SELECT Pos,Name,Event,CASE WHEN ISNUMERIC(Pos) = 1 THEN 1 ELSE 2 END tag
FROM tableName
) tmp
ORDER BY tag,CASE WHEN ISNUMERIC(Pos) = 1 THEN CAST(Pos AS INT) ELSE -1 END,Pos
tag
столбец приведет числовые значения к началу и переместит алфавитные значения обратно. Затем внутри оператора CASE WHEN ISNUMERIC(Pos) = 1 THEN CAST(Pos AS INT) ELSE -1 END
мы преобразуем числовые значения в int, чтобы они были отсортированы по значениям, и оставляем алфавитные значения для сортировки по значениям символов как есть.
Комментарии:
1.
ISNUMERIC
общеизвестно, что он плохо распознает цифры — к сожалению. Я бы предпочел использоватьTRY_CAST
илиTRY_CONVERT
и попытаться преобразовать строку в число — и если это не удается и возвращаетсяNULL
, вы знаете, что это буквенно-цифровое (строковое) значение, а не число — просто это намного надежнее!2. Работал с изменением порядка, используя эти данные запроса, Мудассир Хассан. Спасибо, немного поработав, я смогу заменить таблицу на свежесортированную, с переименованием или двумя.
Ответ №3:
Вы можете использовать следующий запрос:
select *
from Tbl
order by
ISNUMERIC(Pos) DESC, -- set numerical values first
TRY_CAST(Pos AS INT); -- order by numeric value