[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.당신은 SQL Server 2008을 사용하는 경우
당신은 SQL Server 2008을 사용하는 경우
select VersionNo from Versions order by cast('/' + replace(VersionNo , '.', '/') + '/' as hierarchyid);
HIERARCHYID는 무엇인가
편집하다:
2000, 2005, 2008 솔루션 : 여기 T-SQL 정렬 도전에 대한 해결.
도전
-
==============================
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.또 다른 방법은 그것을 할 수 있습니다 :
또 다른 방법은 그것을 할 수 있습니다 :
만 중 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 열을 가질 수 있도록 당신은 스키마를 변경 할 수 있습니다. 그런 다음 정렬은 간단합니다.
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
'SQL' 카테고리의 다른 글
[SQL] 어떻게 관계를 기반으로 한 레코드에 대해 여러 레코드를 얻으려면? (0) | 2020.05.04 |
---|---|
[SQL] SQL에서 대문자로 분할 단어 (0) | 2020.05.04 |
[SQL] ㄱ 열 합을 행을 제한하는 MySQL은 소정의 값과 같다 (0) | 2020.05.04 |
[SQL] 지역 시퀀스는이 포함 제외한 쿼리 연산자의 SQL 구현 () 연산자에 LINQ에서 사용할 수 없습니다 (0) | 2020.05.04 |
[SQL] 데이터베이스 효율 - 사용자의 사용자 대 테이블 당 테이블 (0) | 2020.05.04 |