2013-09-28 2 views
0

테이블이 있고 전 공동 번호 열에 넣고 싶습니다. 내가 그들에게 명령 할 때 컬럼의 값은 내가 이것이 내가SQL 순서는 포함 된 문자와 문자열을 기준으로합니다.

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

아무도 나를 도울 수 SQL 쿼리 후이 결과를 얻으려면

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

결과를 얻을이

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

처럼?

답변

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. 이제이 주문을 쿼리 주문으로 사용하고 있습니다. (예 : AS_NUMERIC (SUBSTRING (joint_no, 4, 5)) = 1 그런 다음 (COMMAND_ NO, 4, 5) 숫자 열만 주문하시오. –

+0

내 답변은 당신이 그것을 할 수있는 방법을 보여주고 있습니다. 필립 - 그론 디어의 조언은 당신에게 더 유용 할 것입니다. – bummi

+0

내 테이블 이름은 제조 테이블입니다 내 컬럼 -i 주문 - 이름은 공동 번호가 없습니다 날 위해이 테이블을 수정할 수 있습니다. 그것은 나에게 매우 좋을 것이다. 그리고 그것이 끝나면 나는 여러 번 승리 할 것이다. :) –

2

을 추가해야 할 수도 있습니다 해결되지 않은 경우 , '논리적 인'순서가 알파벳순으로 고정되도록 값의 번호를 다시 매길 것을 권합니다. 그러면 F-1이 F-01 또는 F-001로 업데이트됩니다.

할 수 없다면 코드의 '정렬 된'형식으로 채울 필드를 추가하십시오. 그러면 F-001 열에 주문하여 F-1 값을 표시 할 수 있습니다.

그렇지 않으면 레코드 주문이 급속하게 악몽이 될 것입니다.

관련 문제