使用SQL Server进行自然排序

时间:2013-02-05 05:29:32

标签: sql sql-server-2008 natural-sort

我想从下面的列名PTNT_VST_CSNO转换值的顺序:

VMIP1
VMIP10
VMIP11
VMIP2
VMIP20
VMIP21
VMIP3
VMIP31
VMIP32
VMIP5
VMIP6
VMIP7
VMIP8
VMIP9
VMOP10
VMOP11
VMOP12
VMOP3
VMOP30
VMOP31
VMOP32
VMOP4
VMOP40
VMOP41
VMOP42
VMOP43
VMOP7
VMOP70
VMOP71
VMOP8
VMOP9

为:

VMIP1
VMIP2
VMIP3
VMIP5
VMIP6
VMIP7
VMIP8
VMIP9
VMIP10
VMIP11
VMIP20
VMIP21
VMIP31
VMIP32
VMOP3
VMOP4
VMOP7
VMOP8
VMOP9
VMOP10
VMOP11
VMOP12
VMOP30
VMOP31
VMOP32
VMOP40
VMOP41
VMOP42
VMOP43
VMOP70
VMOP71

我想首先对'vmip'的数字部分进行排序,然后再对'vmop'的数字部分进行排序。我尝试了很多,但每次都失败了。请帮助我们解决排序问题...提前谢谢

3 个答案:

答案 0 :(得分:1)

这不是世界上最快的事情,但应该完成工作:

ORDER BY CASE WHEN PTNT_VST_CSNO LIKE 'vmi%' THEN 0 ELSE 1 END
        ,CAST(replace(replace(PTNT_VST_CSNO, 'vmip', ''), 'vmop', '') as int)

答案 1 :(得分:0)

实现这一目标的最简单方法是将数字改为3位数。

即。 1将成为001,2将成为002,10将成为010,依此类推......

这将允许您正确地订购数据。

你可能想做这样的事情:

SELECT
  PTNT_VST_CSNO,
  'VMIP' + CASE LEN(REPLACE(PTNT_VST_CSNO, 'VMIP', ''))
    WHEN 1 THEN '00' + REPLACE(PTNT_VST_CSNO, 'VMIP', '')
    WHEN 2 THEN '0' + REPLACE(PTNT_VST_CSNO, 'VMIP', '')
    ELSE REPLACE(PTNT_VST_CSNO, 'VMIP', '')
  END
FROM
  TableName
WHERE
  LEFT(PTNT_VST_CSNO, 4) = 'VMIP'
ORDER BY
  2

答案 2 :(得分:0)

经过大量的审判,我成功地用以下方式解决了这个问题。

SELECT ptnt_vst_csno 
FROM   table_name 
ORDER  BY Substring(ptnt_vst_csno, 1, Charindex('P', ptnt_vst_csno)), 
          CONVERT(INT, Substring(Substring(ptnt_vst_csno, 
                                 Charindex('P', ptnt_vst_csno), 
                                 Len( 
                                              ptnt_vst_csno)), 2, Len( 
                       ptnt_vst_csno)))