Изменить порядок таблицы SQL Server

#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
 

MS SQL fidle