2016-06-09 3 views
2

안녕하세요, 흥미로운 문제가 있습니다. 테이블에 약 1500 개의 레코드가 있습니다. 나는에 대해 정렬 할 필요가 칼럼의 형식은SQL 숫자와 문자열 정렬

문자열 Number.number이다이 같이 할 수 실제로 (옵션 번호) (선택적 문자열)

:. 나는 방법이 필요

AB 2.10.19 
AB 2.10.2 
AB 2.10.20 (I) 
ACA 1.1 
ACA 1.9 (a) V 

대신

AB 2.10.19 
AB 2.10.2 
AB 2.10.20 (I) 

것을 나는이

AB 2.10.2 
AB 2.10.19 
AB 2.10.20 (I) 
0을 얻을 수 있도록 이러한 정렬하려면

표준 형식이 없기 때문에 SQL을 통해이 형식을 정렬 할 수있는 방법이 손실되었습니다.

아무도 제안이없는 한 정렬 값을 나타내는 새로운 int 열을 수동으로 식별하는 시점에 있습니까?

나는 SQL 서버 2008 R2

+0

문자열이 항상 마침표로 구분 된 3 개의 숫자 인 경우 마침표를 구분 기호로 사용하여 구문 분석하고 정수로 변환 한 다음 결과에 따라 정렬 할 수 있습니다. –

+0

아쉽게도 AB 1.1 또는 AB 1.1이 될 수 있습니다.1 AB 1 개 – Andyww

답변

0

이 시도 사용하고 있습니다 :

SELECT column 
FROM  table 
ORDER BY CASE WHEN SUBSTRING(column,LEN(column)-1,1) = '.' 
       THEN 0 
       ELSE 1 
       END, column 

이 먼저 순서에서 마지막 위치에 두 번째의 .을 가지고있는 문자열을 넣어 것입니다.

편집 :초 생각에

,이 선도 'AB'와 함께 작동하지 않습니다, 'ACA'등 대신을 시도해보십시오

SELECT column 
FROM  table 
ORDER BY SUBSTRING(column,1,2), --This will deal with leading letters up to 2 chars 
     CASE WHEN SUBSTRING(column,LEN(column)-1,1) = '.' 
       THEN 0 
       ELSE 1 
       END, 
     Column 

Edit2가를 :

두 번째 숫자 세트도 보정하려면 다음을 사용하십시오.

SELECT column 
FROM  table 
ORDER BY substring(column,1,2), 
CASE WHEN substring(column,charindex('.',column) + 2,1) = '.' and substring(column,len(column)-1,1) = '.' THEN 0 
    WHEN substring(column,charindex('.',column) + 2,1) = '.' and substring(column,len(column)-1,1) <> '.' THEN 1 
    WHEN substring(column,charindex('.',column) + 2,1) <> '.' and substring(column,len(column)-1,1) = '.' THEN 2 
ELSE 3 END, column 

기본적으로 이는 각 조건을 고려하여 계층 적 순서를 지정하는 수동 방법입니다.

+0

감사합니다, 그 거의가 있지만, 즉, 두 번째 숫자에 자사의 이동 정렬 문제, AB 2.1.4 AB 2.1.5 AB 2.10.1 AB 2.10.2 AB 2.2.1 – Andyww

+0

흠 .. 그게 더 어려울거야. –

+0

첫 번째 세트에서도 이런 현상이 발생합니까? 즉. AB 2.1.1, AB 20.1.1 –

0

첫 번째 텍스트 토큰을 정렬 한 다음 두 번째 텍스트 토큰 (숫자가 아닌 일부 숫자를 구성하는 문자열)을 정렬 한 다음 나머지 텍스트를 선택적으로 정렬해야합니다.

with t(f) as (
    select 'AB 2.10.19' union all 
    select 'AB 2.10.2' union all 
    select 'AB 2.10.20 (I)' union all 
    select 'AB 2.10.20 (a) Z' union all 
    select 'AB 2.10.21 (a)' union all 
    select 'ACA 1.1' union all 
    select 'ACA 1.9 (a) V' union all 
    select 'AB 4.1' 
) 

select * from t 
order by 
    left(f, charindex(' ', f) - 1), 
    cast('/' + replace(substring(f, charindex(' ', f) + 1, patindex('%[0-9] %', f + ' ') - charindex(' ', f)) , '.', '/') + '/' as hierarchyid), 
    substring(f, patindex('%[0-9] %', f + ' ') + 1, len(f)) 

f 
---------------- 
AB 2.10.2 
AB 2.10.19 
AB 2.10.20 (a) Z 
AB 2.10.20 (I) 
AB 2.10.21 (a) 
AB 4.1 
ACA 1.1 
ACA 1.9 (a) V 
+0

이 오류가 발생했습니다 : Microsoft.SqlServer.Types.HierarchyIdException : 24001 : 입력 문자열 '/ 1/1/4-2 /'이 SqlHierarchyId 노드의 유효한 문자열 표현이 아니기 때문에 SqlHierarchyId.Parse가 실패했습니다. – Andyww

+1

하이픈을 언급하지 않았습니다. –

0

가 같은 길이

SELECT column 
FROM  table 
ORDER BY left(column + replicate('*', 100500), 100500) 
0
텍스트를 추가

당신이 HIERARCHYID를 사용할 수 있습니다 올바르게 정렬 (나는 가정 버전 번호 등) 2 토큰을 만들려면
--get the start and end position of numeric in the string 
with numformat as 
(select val,patindex('%[0-9]%',val) strtnum,len(val)-patindex('%[0-9]%',reverse(val))+1 endnum 
from t 
where patindex('%[0-9]%',val) > 0) --where condition added to exclude records with no numeric part in them 
--get the substring based on the previously calculated start and end positions 
,substrng_to_sort_on as 
(select val, substring(val,strtnum,endnum-strtnum+1) as sub from numformat) 
--Final query to sort based on the 1st,2nd and the optional 3rd numbers in the string 
select val 
from substrng_to_sort_on 
order by 
cast(substring(sub,1,charindex('.',sub)-1) as numeric), --1st number in the string 
cast(substring(sub,charindex('.',sub)+1,charindex('.',reverse(sub))) as numeric), --second number in the string 
cast(reverse(substring(reverse(sub),1,charindex('.',reverse(sub))-1)) as numeric) --third number in the string 

Sample demo

+0

이것은 내게 다음을 제공했습니다 : LEFT 또는 SUBSTRING 함수에 잘못된 길이 매개 변수가 전달되었습니다. – Andyww

+0

입니다. 왜냐하면 열 값에 숫자 부분이 없기 때문입니다. 귀하의 질문에, 나는 그것이 항상 숫자 부분을 것이라고 가정합니다. 숫자 부분이없는 값을 결과에서 제외 할 수 있는지 확인하면 코드를 편집 할 수 있습니다. –

+0

숫자 부분이없는 행을 제외하는 편집 된 버전을 참조하십시오. –