1

我想用下面的列名转换值的顺序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”的数字部分进行排序。我尝试了很多,但每次都失败了。请帮我解决排序问题......提前谢谢你

4

3 回答 3

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)
于 2013-02-05T06:00:24.397 回答
1

经过一番尝试,我成功地通过以下方式解决了它。

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))) 
于 2013-02-14T07:33:00.020 回答
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
于 2013-02-05T06:05:49.317 回答