2015-12-01 41 views

回答

0

在你查询排序由2列。一个是基于@sortby变量,另一个是name第二个最后一行下面的查询。问题是,当你只挑选整数部分Id它是10这三行你在上面提到你的问题,然后命令通过基于第二列[名称]适用,这是A10BB10A。如果您从您的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个要求只是相冲突的。 :)如果您将保持名称顺序,那么它会正确显示其行为。 –