Интересно, могли ли гении 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
Может, кто-либо иметь какие-либо предложения? Ваша справка очень ценилась бы.
Если вы используете SQL Server 2008
select VersionNo from Versions order by cast('/' + replace(VersionNo , '.', '/') + '/' as hierarchyid);
Редактировать:
Решения для 2000, 2005, 2008: Решение задачи сортировки на T-SQL здесь
Если можете, измените схему так, чтобы в версии было 4 столбца вместо одного. Тогда сортировка проста.
В зависимости от 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);