2015-12-01 2 views

ответ

0

В вашем запросе вы сортировки по 2 колонки. Один из них основан на переменной @sortby, а другой - name на второй последней строке вашего запроса ниже. Вопрос в том, когда вы только выбирая целой части из Id это 10 для этих трех строк вы упомянули в вашем вопросе выше, то распоряжений на основе второго столбца [имя] применяется, который A для 10B и B за 10A. Если вы удалите столбец имен из предложения order by, вы получите правильный результат. Надеюсь, это решит вашу проблему.

declare @sortby varchar(100) 
set @sortby = 'Id' 
select * from emp 

ORDER BY 
    CASE @sortby 
     WHEN 'Id' THEN 
     CASE 
      WHEN ISNUMERIC(Id)=1 
       THEN CAST(Id as int) 
      WHEN PATINDEX('%[^0-9]%',Id) > 1 
       THEN CAST(LEFT(Id,PATINDEX('%[^0-9]%',Id) - 1) as int) 
      ELSE 2147483648 
     END 
    End, 

    CASE @sortby 
     WHEN 'Name' THEN 
     Case 
      WHEN ISNUMERIC(Id)=1 
       THEN NULL 
      WHEN PATINDEX('%[^0-9]%',Id) > 1 
       THEN SUBSTRING(Id,PATINDEX('%[^0-9]%',Id) ,50) 
      ELSE Id 
     END 
    End 

, Name 

DROP TABLE Emp 
+0

Да, я это понимаю. Но я хочу иметь вторую колонку и в моем роде. Есть ли способ исправить это? – jestges

+0

Ваши 2 требования просто противоречивы. :) если вы будете держать имя в порядке, то оно будет корректно показывать свое поведение. –

Смежные вопросы