Как получить максимальное значение столбца с номером версии (varchar) в T-SQL - PullRequest
3 голосов
/ 17 июня 2010

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

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 или какой-либо другой сложной логики, подобной расколу.,Выполнение этого запроса:

SELECT MAX(Version) FROM my_table

даст ошибочный результат:

2.3.9

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

Ответы [ 2 ]

10 голосов
/ 17 июня 2010

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

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
3 голосов
/ 17 июня 2010

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

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

...