XYZ와 같은 일반적인 소프트웨어 릴리스 버전을 주문하는 방법은 무엇입니까?


13

"SoftwareReleases"테이블이 주어진 경우 :

| id | version |
|  1 | 0.9     |
|  2 | 1.0     |
|  3 | 0.9.1   |
|  4 | 1.1     |
|  5 | 0.9.9   |
|  6 | 0.9.10  |

이 출력을 어떻게 생성합니까?

| id | version |
|  1 | 0.9     |
|  3 | 0.9.1   |
|  5 | 0.9.9   |
|  6 | 0.9.10  |
|  2 | 1.0     |
|  4 | 1.1     |

답변:


22

원하는 출력을 생성하려면 다음을 수행하십시오.

SELECT id, version
FROM   versions
ORDER  BY string_to_array(version, '.')::int[];

전체 text배열을 배열로 캐스트 할 수 있습니다 integer( 9전에 정렬 10).
하나는 ORDER BY유형 을 배열 할 수 있습니다. 이는 각 요소의 순서와 동일합니다. 더 짧은 어레이는 동일한 선행 부품을 가진 더 긴 어레이보다 먼저 나옵니다.

db <> fiddle here
이전 SQL 바이올린.


1
대단하다. 어쨌든 이것은 (1.6.9-> 1.7.1-> 1.7) 대신 null 순서를 지정하지 않고 누락 된 값을 올바르게 정렬합니다 (1.6.9-> 1.7-> ​​1.7.1). 이것을 받아들입니다.
크리스 베티

2
숫자가 아닌 문자가 포함 된 Maven 버전 또는 버전을 다루는 경우 숫자가 아닌 문자를 먼저 제거 할 수 있습니다.string_to_array(regexp_replace(version, '[^0-9.]', '', 'g'), '.')::int[]
Samuel

나는 최대 버전을 찾으려면이를 사용하고 잘 작동합니다SELECT max(string_to_array(build_version, '.')::int[]
Joviano 디아스

6
select id,
       name, 
       v[1] as major_version,
       v[2] as minor_version,
       v[3] as patch_level
from (
   select id, 
          name, 
          string_to_array(version, '.') as v
   from versions
) t
order by v[1]::int desc, v[2]::int desc, v[3]::int desc;

SQLFiddle : http://sqlfiddle.com/#!15/c9acb/1

버전 문자열에 더 많은 요소가 필요하면 더 많은 배열 인덱스를 사용하십시오. 인덱스가 존재하지 않는 경우, 결과는 널 (NULL)이 될 것입니다 (예를 들어 v[10]반환됩니다 null)


이것을 숫자로 변환해야합니까? 그렇지 않으면 내가 기대 10사이 여야 1하고 2.
JNK

이것은 당신의 바이올린에 의해 확인됩니다 ...
JNK

이를 위해 내 것을 삭제합니다. string_to_array는 정규식보다 훨씬 간단합니다.
Chris Betti

@ JNK : 그게 무슨 일이야 v[1]::int. 문자열을 정수로 캐스팅합니다.
a_horse_with_no_name

귀하의 SQL에 대한 유일한 변경 사항은 주문입니다. 나는 desc를 꺼내서 @Chris Betti가 찾고있는 결과 세트를 만들 것을 제안합니다.
일요일

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.