Как заказать обычные версии программного обеспечения, такие как 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 <> скрипка здесь
Старая скрипка SQL.

Эрвин Брандштеттер
источник
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[]
Самуил,
Я использую это, чтобы найти максимальную версию, и она прекрасно работает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)

a_horse_with_no_name
источник
Вам нужно преобразовать их в числа? В противном случае я ожидал 10бы быть между 1и 2.
JNK
Это подтверждается вашей скрипкой ...
JNK
Удаление моего в пользу этого. string_to_array намного проще, чем регулярное выражение.
Крис Бетти
@JNK: вот v[1]::intо чем. Он преобразует строку в целое число.
a_horse_with_no_name
Единственное изменение, которое я внесу в ваш SQL - это порядок. Я предлагаю взять desc, и это создаст набор результатов, который ищет Крис Бетти.
Вс