1

我被要求按升序对位置表进行排序。表中的数据目前看起来像这样:

  • 100F01
  • 105B02
  • 10B01
  • GK1-A01
  • 201E12
  • 20A01

但是,当此数据显示在屏幕上时,我希望它按升序对数字结果进行排序,然后按字母顺序对字符串结果进行排序。输出应如下所示:

  • 10B01
  • 20A01
  • 100F01
  • 105B02
  • 201E12
  • GK1-A01

我尝试使用以下代码

SELECT location FROM freelocations
ORDER BY CAST(SUBSTRING(location, 1, 2) AS INT)

但是,正如预期的那样,这会返回一条错误消息,因为某些位置不以数字开头:

将 varchar 值“GK”转换为数据类型 int 时转换失败。

任何想法或提示将不胜感激

4

4 回答 4

3

也许是这样的?

select location 
from freelocations
order by 
    case 
       when patindex('%[^0-9]%', location) = 1 then 9999999999
       else cast(substring(location, 1, patindex('%[^0-9]%', location) - 1) as int)
    end,
    location

(由于 SQL Server 缺少正则表达式替换功能,有点笨拙)

于 2013-01-25T13:46:38.227 回答
0

在投射之前,您应该检查前 2 个或 3 个字符是否真的是数字:

SELECT
  location
FROM
  freelocations
ORDER BY
  CASE
    WHEN location like '[0-9][0-9][0-9]%' THEN cast(substring(location,1,3) AS INT)
    WHEN location like '[0-9][0-9]%' THEN cast(substring(location,1,2) AS INT)
    ELSE 9999
  END
于 2013-01-25T13:41:24.100 回答
0

按 FIELD(string+0,1),string+0 排序

但请注意,“10e20”会被误解!

于 2013-01-25T13:43:38.440 回答
0

试试这个以避免铸造:

SELECT 
    x,
    RIGHT('000' +LEFT (x,patindex('%[^0-9]%',x)-1),3) sort1,
    RIGHT (x,LEN(x)-patindex('%[^0-9]%',x)+1) sort2
FROM
(
    SELECT '123asdf' x
    UNION
    SELECT '12asdf'     
    UNION
    SELECT '13asdf'  
    UNION
    SELECT '12zsdf'  
) X
ORDER BY sort1 ,sort2 
于 2013-01-25T13:50:32.507 回答