Как получить значение MAX столбца номер версии (varchar) в T-SQL

У меня есть таблица, определенная следующим образом:

Column:  Version     Message
Type:    varchar(20) varchar(100)
----------------------------------
Row 1:    2.2.6       Message 1
Row 2:    2.2.7       Message 2
Row 3:    2.2.12      Message 3
Row 4:    2.3.9       Message 4
Row 5:    2.3.15      Message 5

Я хочу написать запрос T-Sql, который получит сообщение для номера версии MAX, где столбец "Версия" представляет номер версии программного обеспечения. Т.е., 2.2.12 больше 2.2.7, а 2.3.15 больше 2.3.9 и т.д. К сожалению, я не могу придумать простой способ сделать это, не используя CHARINDEX или какую-то сложную другую подобную split-подобную логику, Выполнение этого запроса:

SELECT MAX(Version) FROM my_table

приведет к ошибочному результату:

2.3.9

Когда это действительно будет 2.3.15. Любые яркие идеи, которые не слишком сложны?

Ответ 1

Одним из решений было бы использовать функцию разделения таблиц, чтобы разделить версии на строки, а затем объединить их обратно в столбцы, чтобы вы могли сделать что-то вроде:

Select TOP 1 Major, Minor, Build
From ( ...derived crosstab query )
Order By Major Desc, Minor Desc, Build Desc

На самом деле, другой способ - использовать функцию PARSENAME, предназначенную для разделения имен объектов:

Select TOP 1 Version
From Table
Order By Cast(Parsename( Z.Version , 3 ) As Int) Desc
    , Cast(Parsename( Z.Version , 2 ) As Int) Desc
    , Cast(Parsename( Z.Version , 1 ) As Int) Desc

Ответ 2

Должно ли быть эффективным на большой таблице? Я предлагаю вам создать индексированный упорный вычисляемый столбец, который преобразует версию в формат, который правильно работает, и использует вычисленный столбец в ваших запросах. В противном случае вы всегда будете сканировать до конца.

Если таблица небольшая, это не имеет значения. Затем вы можете использовать ранжирование "точно в срок", используя функцию split или (ab), используя парсамед, как предложил Томас.