table1에는 파일명과 그파일의 파일버전이 입력되어 있습니다.
table1 name version a 5.1.235.0 a 5.1.235.1 b 5.3.254.1 b 5.3.254 c 5.2.1 d 4.235.1.1 이런식으로 되어있습니다.
지금 각 파일명마다 version을 최신순으로 정렬시켜야 하는데 데이터타입이 nchar여서 그대로 정렬시키면 문자로 정렬을 시켜버립니다. 그래서 '.'을 기준으로 각각의 숫자를 비교하려고 합니다. 그래서 아래와 같은 방식으로 정렬을 시키려고 했는데 문제는 각 version들이 '.'의 개수도 다르고 '.'이 언제 또 생길지 모른다는 점과 마지막엔 '.'없어서 마지막 숫자를 어디까지 자를 것인지 기준이 없어져 버립니다. 또 '.'이 길어질수록 쿼리를 생각해내기가 너무 복잡해져버립니다. 혹시 정렬 시킬 수 있는 다른 방법이나 있을까요...? 다른 방법이 없어서 아래 쿼리와 같이 쓸수밖에 없다면.. '.'개수가 다른건 어떻게 해결하고 마지막 숫자는 어떻게 잘라내서 비교를 해야 할까요...
select name , version, --첫문자부터 처음나오는 '.'전까지 , cast(SUBSTRINGversion, 1, CHARINDEX('.', version)-1) as int) as 첫번째 --처음 나오는 '.' 다음 숫자부터 두번째 나오는 '.' 전 숫자까지 자르기 , cast(substring(version, CHARINDEX('.', version)+1, (charindex('.', version, charindex('.', version)+1)) - (CHARINDEX('.', version)+1)) as int) as 두번째 from table1 order by 첫번째 desc, 두번째 desc
Comment 11
-
이리
2015.01.30 09:19
-
cksql
2015.01.30 09:51
예를들어파일명 버전
a 5.3.9
a 5.3.8
a 5.3.29
a 5.3.28.1
이렇게 있다고하면 desc로 정렬시 결과는
5.3.29
5.3.28.1
5.3.9
5.3.8
이어야 합니다.
그런데 replace로 '.'을 지우고 desc로 정렬시키면(데이터 타입은 nchar)
5.3.9
5.3.8
5.3.29
5.3.28.1
이렇게 나옵니다. 그렇다고 replace로 '.'을 지우고 데이터형식을 int 변환후 desc로 정렬시키면
5.3.28.1
5.3.29
5.3.9
5.3.8
이러한 결과가 나오게 됩니다ㅠㅠ
-
이리
2015.01.30 10:13
5.3.9 보다 5.3.29 가 상위버전인건가요?
제가 버전 체계를 잘 몰라서 ^^;;
-
cksql
2015.01.30 10:21
5.3.9
5.3.29 두개가 있다면
'.'을 기준으로 비교해야 합니다
먼저 두 버전에 첫번째 '.'이 나오기 전 숫자두개를 비교합니다(5와 5를 비교)
그리고 그다음 숫자(3과 3)을 비교하고
그다음 숫자(9와 29)를 비교합니다
'.'을 기준으로 더 큰 숫자가 최신버전입니다.
5.3.29
5.3.9
두 버전중 최신버전은 5.3.29입니다
-
펑션을 하나 만드세요.
"."을 기준으로 스프릿 시켜서 앞에 0을 붙여서 10자리 정도로 만들어버립니다.
그렇게 해서 나온 결과를 뒤에 0을 붙여서 1000자리 정도로 만들어버립니다.
그 이상 넘어가는건 그때 생각하자구요 -_-;;
5.3.29와 5.3.9를 펑션을 적용하면 (0 4개로 합시다)
0005 0003 0029 0000
0005 0003 0009 0000 이렇게 됩니다. 5.3.29가 최신 버전이 되겠네요.
"."갯수가 다른 경우는
5.3.29와 5.3.28.1의 경우는
0005 0003 0029 0000
0005 0003 0028 0001 이 경우도 5.3.29가 최신버전으로 평가됩니다.
-
역시 구글링 하니까 멋진 솔루션이 나오네요.
SELECT * FROM table1 ORDER BY CAST('/' + REPLACE(VERSION, '.', '/') + '/' AS HIERARCHYID)
-
cksql
2015.02.02 13:39
구글링 특별히 다르게 검색하시는 방법이 있나요?
저는 해도해도 잘 안나오던데ㅠㅠ
고맙습니다!
-
아는 단어 늘어놓고 검색결과 일일이 까는거 말고 뭐 특별할게 있나요 ㅎㅎ
SQL SERVER VERSION SORT 로 검색했습니다.
-
cksql
2015.02.02 18:48
아하 해외사이트가 정보가 더 많은거 같은데 영어가 안되서ㅠㅠ
내용이 다 영어로 되어있으면 해석하시나요......?
아니면 구글번역하시나요?
-
원론
2015.01.30 19:25
-- or parsename
IF OBJECT_ID('table1') IS NOT NULL
DROP TABLE table1
GO
CREATE TABLE table1
(
name CHAR(1)
, [version] NCHAR(15)
)
GO
INSERT INTO table1
SELECT 'a', '5.1.235.0' UNION ALL
SELECT 'a', '5.1.235.1' UNION ALL
SELECT 'b', '5.3.254.1' UNION ALL
SELECT 'b', '5.3.254' UNION ALL
SELECT 'c', '5.2.1' UNION ALL
SELECT 'd', '4.235.1.1'
GO
SELECT *
FROM table1
ORDER BY CONVERT(BIGINT,REVERSE(ISNULL(PARSENAME(REVERSE([version]),1),0))) * POWER(CONVERT(BIGINT,10),9)
+ CONVERT(BIGINT,REVERSE(ISNULL(PARSENAME(REVERSE([version]),2),0))) * POWER(CONVERT(BIGINT,10),6)
+ CONVERT(BIGINT,REVERSE(ISNULL(PARSENAME(REVERSE([version]),3),0))) * POWER(CONVERT(BIGINT,10),3)
+ CONVERT(BIGINT,REVERSE(ISNULL(PARSENAME(REVERSE([version]),4),0))) DESC
GO
-
cksql
2015.02.02 13:40
여러가지 방법이 있군요...
고맙습니다!
REPLCAE를 이용해서 .을 제거하고 정렬하는건 어떨까요?