Как получить максимальное значение числовых значений в столбце varchar - PullRequest
8 голосов
/ 01 апреля 2009

У меня есть таблица с колонкой nvarchar. Этот столбец имеет значения, например:

  • 983
  • 294
  • a343
  • a3546f

и так далее.

Я бы хотел взять МАКСИМАЛЬНОЕ из этих значений, но не как текст, а как из чисел. Так что в этом примере цифры:

  • 983
  • 294
  • 343
  • 3546

И последнее значение MAX - 3546. Как это сделать в TSQL на Microsoft SQL?

Ответы [ 8 ]

8 голосов
/ 01 апреля 2009

Сначала установите функцию регулярного выражения. Эта статья содержит код, который вы можете вырезать / вставить.

Затем с помощью RegexReplace (из этой статьи) вы можете извлечь цифры из строки:

dbo.RegexReplace( '.*?(\d+).*', myField, '$1' )

Затем преобразуйте эту строку в число:

CAST( dbo.RegexReplace( '.*?(\d+).*', myField, '$1' ) AS INT )

Затем используйте это выражение внутри MAX() функции в SELECT.

2 голосов
/ 01 апреля 2009

Вы можете попытаться сделать это простым, не используя регулярные выражения alt text

Вот источник

create table #t ( val varchar(100) )
insert #t select 983
insert #t select 294
insert #t select 'a343'
insert #t select 'a3546f';
GO

;with ValueRange as (
    select  val,
        [from] = patindex('%[0-9]%', val), 
        [to] = case patindex('%[a-z]', val) 
            when 0 then len(val) 
            else patindex('%[a-z]', val) - patindex('%[0-9]%', val) 
               end
    from    #t
)
select  substring(val, [from], [to]) as val
from    ValueRange VR
order by cast(substring(val, [from], [to]) as int) desc
2 голосов
/ 01 апреля 2009

CAST (), вероятно, сделает трюк.

SELECT MAX(CAST(yourColumn AS int)) AS maxColumns FROM yourTable

Редактировать. Я не прочитал весь вопрос, как кажется ...

– Function to strip out non-numeric chars
ALTER FUNCTION dbo.UDF_ParseNumericChars
(
  @string VARCHAR(8000)
)
RETURNS VARCHAR(8000)
AS
BEGIN
  DECLARE @IncorrectCharLoc SMALLINT
  –SET @IncorrectCharLoc = PATINDEX(’%[^0-9A-Za-z]%’, @string)
  SET @IncorrectCharLoc = PATINDEX(’%[^0-9.]%’, @string)
  WHILE @IncorrectCharLoc > 0
  BEGIN
    SET @string = STUFF(@string, @IncorrectCharLoc, 1, ”)
    SET @IncorrectCharLoc = PATINDEX(’%[^0-9.]%’, @string)
  END
  SET @string = @string
  RETURN @string
END
GO

Я выбрал его отсюда. (хотя я проголосовал за ответ reg exp)

1 голос
/ 01 апреля 2009

вы можете написать что-то вроде

create FUNCTION [dbo].[getFirstNumeric](
    @s VARCHAR(50)
)  
RETURNS int AS 
BEGIN

set @s = substring(@s,patindex('%[0-9]%',@s),len(@s)-patindex('%[0-9]%',@s) + 1) 
if patindex('%[^0-9]%',@s) = 0
    return @s
set @s = substring(@s,1,patindex('%[^0-9]%',@s)-1) 

return cast(@s as int)
end

, а затем позвоните

select max(dbo.getFirstNumeric(yourColumn)) from yourTable

если вы используете SQL Server 2005 или никогда, вы также можете использовать решение, опубликованное Sung Meister

0 голосов
/ 10 ноября 2010

Это старый вопрос, я знаю, но для добавления в базу знаний для других ...

Предполагая, что все ваши значения содержат хотя бы 1 число:

Select max(convert(int, SubString(VarName, PATINDEX('%[0-9]%',VarName), Len(VarName))))
from ATable
0 голосов
/ 02 апреля 2009
SELECT dbo.RegexReplace('[^0-9]', '','a5453b',1, 1)

и установка RegexReplace, как сказал Джейсон Коэн

0 голосов
/ 01 апреля 2009

Используя пользовательскую функцию, проанализируйте значение в int и затем запустите select.

SELECT MAX(dbo.parseVarcharToInt(column)) FROM table
0 голосов
/ 01 апреля 2009

Насколько я знаю, вам нужно будет создать процесс (или пользовательскую функцию) для очистки столбца, чтобы вы могли фактически преобразовать его в INT или другой соответствующий тип данных, тогда вы можете взять максимум этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...