Как получить значение 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), используя парсамед, как предложил Томас.