使用SQL Server进行自然排序
我想将列名为使用SQL Server进行自然排序,sql,sql-server-2008,natural-sort,Sql,Sql Server 2008,Natural Sort,我想将列名为PTNT\u VST\u 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 致: 我想先对“v
PTNT\u VST\u 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
致:
我想先对“vmip”的数字部分进行排序,然后对“vmop”的数字部分进行排序。。我试了很多次,但每次都失败了。请帮我解决排序问题。。。提前谢谢你这不是世界上最快的事情,但它应该能完成任务:
ORDER BY CASE WHEN PTNT_VST_CSNO LIKE 'vmi%' THEN 0 ELSE 1 END
,CAST(replace(replace(PTNT_VST_CSNO, 'vmip', ''), 'vmop', '') as int)
实现这一点最简单的方法是将数字改为3位数 i、 e.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
经过巨大的考验,我成功地用以下方法解决了这个问题
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)))
欢迎使用StackOverflow:如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮(
{}
),以精确地格式化和语法突出显示它!非常感谢您以正确的格式编辑样本…从今以后,我将在发布之前检查所有这些。。。请帮我解决这个问题…谢谢
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)))