SQL查询按字母数字值排序

时间:2015-12-01 17:17:11

标签: sql-server-2008 sql-order-by

以下查询有什么问题?

我希望在屏幕下方输出为10,10A,10B。但我的查询中有问题。

enter image description here

这是我的sqlfiddle链接。 http://sqlfiddle.com/#!3/3bbfe/1

1 个答案:

答案 0 :(得分:0)

查询中,您按2列排序。一个基于@sortby变量,另一个基于name,位于下方查询的倒数第二行。问题是,当你只选择Id整数部分时,你在上面的问题中提到的这三行是10,那么按第二列排序[name] 适用,A10BB10A。如果从order by子句中删除name列,则会得到正确的结果。希望这能解决你的问题。

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