自定义sql排序

时间:2014-03-22 10:55:07

标签: sql sql-server sql-server-2008 sorting

我是SQL新手.. 我想对一列进行排序,该列的值将是 示例:D2V2PRT1,D1V2PRT2,D2V1PRT1,D1V1PRT3......

我希望将输出排序为

D1V1PRT3,
D1V2PRT2,
D2V1PRT1,
D2V2PRT1,......

因此排序应该发生,首先它将为D值排序,然后为V值排序,然后对于PRT值,所有值都在字符串中。

我已经编写了一些逻辑并能够将值与D V和PRT分开,所以现在我的问题是如何按顺序指定

先谢谢

2 个答案:

答案 0 :(得分:2)

您可以使用charindex提取数字:

declare @t table (id varchar(100));
insert @t values ('D1V1PTR1'), ('D100V1PTR1'), ('D1V8PTR5'), ('D1V40PTR10');

; with  extracted as
        (
        select  substring(id, 2, charindex('V', id)-2) as D
        ,       substring(id, charindex('V', id)+1, 
                              charindex('PTR', id)-charindex('V', id)-1) as V
        ,       substring(id, charindex('PTR', id)+3, 100) as PTR
        from    @t
        )
select  *
from    extracted
order by
        cast(d as bigint)
,       cast(v as bigint)
,       cast(ptr as bigint)

Example at SQL Fiddle.

如您所见,SQL不是解析字符串的最佳语言。 :)

答案 1 :(得分:1)

使用ORDER BY SUBSTRING(...)对部分字符串进行排序,如下所示:

order by substring(val, 1, 2), substring(val, 3, 2), substring(val, 5, 4)

这假设D和V字段是两个字符长且PRT四个字符和排序字符串(D1V1等等),而不是数字值,可能不是正确,但由于你已经有分裂字符串的逻辑,它应该很容易调整。