복붙노트

[SQL] 어떻게 총칭 SQL Server 쿼리를 사용하여 정렬 할 수 있나요 A '버전 번호'열

SQL

어떻게 총칭 SQL Server 쿼리를 사용하여 정렬 할 수 있나요 A '버전 번호'열

우리 사이에 SQL 천재가 나에게 도움의 손길을 빌려 수 있는지 궁금하다.

나는 '버전 번호'값 등이 포함 된 테이블 버전의 열 VersionNo이

VersionNo
---------
1.2.3.1
1.10.3.1
1.4.7.2

기타

순서대로 나온다 그래서 나는이 정렬 찾고 있어요,하지만 난에 의해 표준 순서를 수행 할 때 불행하게도, 그것은 문자열로 처리됩니다

VersionNo
---------
1.10.3.1
1.2.3.1
1.4.7.2

대신 난 후 나는 무엇을 다음의 :

VersionNo
---------
1.2.3.1
1.4.7.2
1.10.3.1

그럼, 내가해야 할 것은 반대 순서로 번호를 기준으로 정렬하는 것입니다 (예를 들어 a.b.c.d를에, 나는 올바른 정렬 순서를 얻기 위해, D, C, B를 기준으로 정렬 필요).

하지만 일반적인 방법으로이를 달성하는 방법에 대한 붙어입니다. 물론, 나는 다양한 SQL 함수를 사용하여 문자열을 분할 할 수 있습니다 (예를 들어, 오른쪽, 부분 문자열, 렌, charIndex의 왼쪽),하지만 난 항상 버전 번호 4 개 부분이 될 것이라고 보장 할 수 없습니다. 이 같은 목록이있을 수 있습니다 :

VersionNo
---------
1.2.3.1
1.3
1.4.7.2
1.7.1
1.10.3.1
1.16.8.0.1

누구나 어떤 제안이 있는가 수 있습니까? 여러분의 도움이 많이 주시면 감사하겠습니다.

해결법

  1. ==============================

    1.당신은 SQL Server 2008을 사용하는 경우

    당신은 SQL Server 2008을 사용하는 경우

    select VersionNo from Versions order by cast('/' + replace(VersionNo , '.', '/') + '/' as hierarchyid);
    

    HIERARCHYID는 무엇인가

    편집하다:

    2000, 2005, 2008 솔루션 : 여기 T-SQL 정렬 도전에 대한 해결.

    도전

  2. ==============================

    2.MySQL을위한 SQL 엔진에 따라이 같은 STH 될 것이다 :

    MySQL을위한 SQL 엔진에 따라이 같은 STH 될 것이다 :

    SELECT versionNo FROM Versions
    ORDER BY
    SUBSTRING_INDEX(versionNo, '.', 1) + 0,
    SUBSTRING_INDEX(SUBSTRING_INDEX(versionNo, '.', -3), '.', 1) + 0,
    SUBSTRING_INDEX(SUBSTRING_INDEX(versionNo, '.', -2), '.', 1) + 0,
    SUBSTRING_INDEX(versionNo, '.', -1) + 0;

    MySQL 버전 3.23.15 위의 경우

    SELECT versionNo FROM Versions ORDER BY INET_ATON(ip);
    
  3. ==============================

    3.또 다른 방법은 그것을 할 수 있습니다 :

    또 다른 방법은 그것을 할 수 있습니다 :

    만 중 A, B, C, D가 만이 아니라 열에로부터 데이터를 분리하고, A, B, C, D (모든 내림차순)가 주문을 할 수 있고 상위 1 행 간다면

    당신은 E, F, G 말을 D보다 더로 확장 할 필요하면 그냥 ... 그래서 쿼리에 1,2,3,4,5,6,7에, 1,2,3,4 변경

    검색어 : 데모 참조

    create table t (versionnumber varchar(255))
    insert into t values
    ('1.0.0.505')
    ,('1.0.0.506')
    ,('1.0.0.507')
    ,('1.0.0.508')
    ,('1.0.0.509')
    ,('1.0.1.2')
    
    
    ; with cte as 
    (
        select 
        column1=row_number() over (order by (select NULL)) ,
        column2=versionnumber
        from t
        )
    
    select top 1
        CONCAT([1],'.',[2],'.',[3],'.',[4])
    from 
    (
        select 
            t.column1,
            split_values=SUBSTRING( t.column2, t1.N, ISNULL(NULLIF(CHARINDEX('.',t.column2,t1.N),0)-t1.N,8000)),
            r= row_number() over( partition by column1 order by t1.N) 
        from cte t 
            join
            (
                select 
                    t.column2,
                    1 as N 
                from cte t  
                    UNION ALL
                select 
                    t.column2,
                    t1.N + 1 as N
                from cte t 
                    join
                    (
                     select 
                        top 8000
                            row_number() over(order by (select NULL)) as N 
                     from 
                        sys.objects s1 
                            cross join 
                       sys.objects s2 
                    ) t1 
                on SUBSTRING(t.column2,t1.N,1) = '.'
             ) t1
              on t1.column2=t.column2
    )a
    pivot
    ( 
        max(split_values) for r in ([1],[2],[3],[4])
       )p
      order by [1] desc,[2] desc,[3] desc,[4] desc
    
  4. ==============================

    4.버전이 하나가 아닌 4 열을 가질 수 있도록 당신은 스키마를 변경 할 수 있습니다. 그런 다음 정렬은 간단합니다.

    버전이 하나가 아닌 4 열을 가질 수 있도록 당신은 스키마를 변경 할 수 있습니다. 그런 다음 정렬은 간단합니다.

  5. from https://stackoverflow.com/questions/3474870/how-can-i-sort-a-version-number-column-generically-using-a-sql-server-query by cc-by-sa and MIT license