Як ЗАМОВИТИ за типовими версіями випуску програмного забезпечення, як 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 тут
Стара SQL Fiddle.


1
Це чудово. Так чи інакше, це сортує пропущені значення правильно, не вказуючи порядок нулів: (1.6.9 -> 1.7 -> 1.7.1), а не (1.6.9 -> 1.7.1 -> 1.7). Прийняття цього.
Кріс Бетті

2
Якщо ви маєте справу з версіями Maven або версіями, які можуть містити нечислові символи, ви можете спочатку видалити нечислові символи:string_to_array(regexp_replace(version, '[^0-9.]', '', 'g'), '.')::int[]
Samuel

Я використовую це, щоб знайти максимальну версію, і вона чудово працюєSELECT max(string_to_array(build_version, '.')::int[]
Joviano Dias

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

Якщо ви очікуєте більше елементів у рядку версії, просто використовуйте більше індексів масиву. Якщо індекс не існує, результат буде нульовим (наприклад v[10], повернеться null)


Вам потрібно перетворити їх у числа? Інакше я б очікував 10бути між 1і 2.
JNK

Це підтверджує ваша скрипка ...
JNK

Видалення шахти на користь цього. string_to_array набагато простіше, ніж регулярний вираз.
Кріс Бетті

@JNK: саме про це v[1]::intйдеться. Він відкидає рядок до цілого числа.
a_horse_with_no_name

Єдина зміна, яку я вніс би у ваш SQL, - це порядок виконання. Я пропоную зняти desc, і це створить набір результатів @Chris Betti шукає.
нд

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.