Как я могу отсортировать столбец 'номера версии' в общем Используя запрос SQL Server

Интересно, могли ли гении SQL среди нас помочь мне.

У меня есть столбец VersionNo в таблице Versions это содержит значения 'номера версии' как

VersionNo
---------
1.2.3.1
1.10.3.1
1.4.7.2

и т.д.

Я надеюсь сортировать это, но к сожалению, когда я делаю стандарт order by, это рассматривают как строку, таким образом, порядок выходит как

VersionNo
---------
1.10.3.1
1.2.3.1
1.4.7.2

Intead следующего, которое является тем, что я после:

VersionNo
---------
1.2.3.1
1.4.7.2
1.10.3.1

Так, что я должен сделать, должен отсортировать по числам в обратном порядке (например, в a.b.c.d, я должен отсортировать по d, c, b, для получения корректного порядка вида).

Но я застреваю относительно того, как достигнуть этого УНИВЕРСАЛЬНЫМ способом. Несомненно, я могу разделить строку с помощью различных функций sql (например. left, right, substring, len, 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

Может, кто-либо иметь какие-либо предложения? Ваша справка очень ценилась бы.

12
задан James Wiseman 13 August 2010 в 07:55
поделиться

3 ответа

Если вы используете SQL Server 2008

select VersionNo from Versions order by cast('/' + replace(VersionNo , '.', '/') + '/' as hierarchyid);

Что такое hierarchyid

Редактировать:

Решения для 2000, 2005, 2008: Решение задачи сортировки на T-SQL здесь

The challenge

21
ответ дан 2 December 2019 в 06:07
поделиться

Если можете, измените схему так, чтобы в версии было 4 столбца вместо одного. Тогда сортировка проста.

0
ответ дан 2 December 2019 в 06:07
поделиться

В зависимости от SQL движка для MySQL будет примерно так:

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
ответ дан 2 December 2019 в 06:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: