2013-09-28 38 views
0

我有一个表,我想column joint_no列。该列的值是这样的通过包含字符和字符串的SQL顺序

FW-1 
FW-2 
. 
. 
. 
FW-13 
FW-R1 
FW-1A 

当我命令他们我得到这个结果

FW-1 
FW-10 
FW-11 
FW-12 
FW-13 
FW-1A 
. 
. 
FW-R1 

我想要得到的SQL查询后,这个结果

FW-1 
FW-1A 
FW-2 
FW-3 
.. 
FW-13 
FW-R1 

任何人可以帮助我吗?

回答

0

使用PATINDEX找到第一个数字表达式作为第一个排序字段,然后提取数字部分为整数作为第二和的SortField使用整个字符串作为第三个排序字段你可能会得到期望的结果。

Declare @a Table (c varchar(50)) 
Insert Into @a 
Select 'FW-1' 
Union Select 'FW-10' 
Union Select 'FW-11' 
Union Select 'FW-12' 
Union Select 'FW-13' 
Union Select 'FW-1A' 
Union Select 'FW-2' 
Union Select 'FW-3' 
Union Select 'FW-R1' 
Union Select 'FW-A1' 
;With CTE as 
(Select 1 as ID 
Union All 
Select ID + 1 from CTE where ID < 100 
) 

Select * from 
(
Select c 
,PATINDEX('%[0-9]%',c) as s1 
,(Select Cast(
      (Select Case 
        When SUBSTRING(c, ID, 1) LIKE '[0-9]' 
        Then SUBSTRING(c, ID, 1) 
        Else '' 
        End 
      From (Select * from CTE) AS X(ID) 
      Where ID <= LEN(c) 
      For XML PATH('')) 
      as int) 
    ) 
    as s2 
from 
@a 
) x 
order by 
s1,s2,c 

随着输出:

FW-1 4 1 -1 
FW-1A 4 1 -1A 
FW-2 4 2 -2 
FW-3 4 3 -3 
FW-10 4 10 -10 
FW-11 4 11 -11 
FW-12 4 12 -12 
FW-13 4 13 -13 
FW-A1 5 1 A1 
FW-R1 5 1 R1 

如果前导部分不固定(FW-),你可能需要添加一个额外的排序字段

Declare @a Table (c varchar(50)) 
Insert Into @a 
Select 'FW-1' 
Union Select 'FW-10' 
Union Select 'FW-11' 
Union Select 'FW-12' 
Union Select 'FW-13' 
Union Select 'FW-1A' 
Union Select 'FW-2' 
Union Select 'FW-3' 
Union Select 'FW-R1' 
Union Select 'FW-A1' 
Union Select 'AB-A1' 
Union Select 'AB-11' 
;With CTE as 
(Select 1 as ID 
Union All 
Select ID + 1 from CTE where ID < 100 
) 

Select * from 
(
Select c 
,SubString(c,1,PATINDEX('%[0-9]%',c)-1) as S0 
,PATINDEX('%[0-9]%',c) as s1 
,(Select Cast(
      (Select Case 
        When SUBSTRING(c, ID, 1) LIKE '[0-9]' 
        Then SUBSTRING(c, ID, 1) 
        Else '' 
        End 
      From (Select * from CTE) AS X(ID) 
      Where ID <= LEN(c) 
      For XML PATH('')) 
      as int) 
    ) 
    as s2 
from 
@a 
) x 
order by 
s0,s1,s2,c 
+0

谢谢你的询问非常好。它会拯救我的生命:P。现在,我使用这个命令通过查询 为了通过(CASE WHEN ISNUMERIC(SUBSTRING(joint_no,4,5))= 1,则(CAST(SUBSTRING(joint_no,4,3)AS INT))结束) 它会帮助我只订购数字列 –

+0

我的回答只显示(技术)你能做到这一点,@ Philippe-Grondier的建议会对你更有用。 – bummi

+0

我的表名是fabrication_table 我的专栏-i想要订购 - 名称是联合编号 可以为我修改此表。这对我来说非常好。如果能完成的话,我会赢得很多次:) –

2

如果你能做到这一点,我建议你重新编号,以便“逻辑”顺序符合字母顺序。 F-1将更新为F-01或F-001。

如果你不能做到这一点,添加将你的代码的“有序”的形式进行填充的字段。你会那么可以由F-001列订单,仍然显示了F-1的值

否则您的订购记录将很快成为你的噩梦。