如何在varchar列中获取数值的MAX值

时间:2009-04-01 14:09:24

标签: sql-server tsql

我有一个带有nvarchar列的表。此列具有值,例如:

  • 983
  • 294
  • a343
  • a3546f

等等。

我想把这个值的MAX,但不是文本,而是来自数字。所以在这个例子中,数字是:

  • 983
  • 294
  • 343
  • 3546

MAX值是最后一个--3546。如何在Microsoft SQL上的TSQL中执行此操作?

9 个答案:

答案 0 :(得分:8)

首先安装正则表达式函数。 This article包含您可以剪切/粘贴的代码。

然后使用RegexReplace(来自该文章),您可以从字符串中提取数字:

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

然后将此字符串转换为数字:

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

然后在MAX()。{/ p>中的SELECT函数中使用此表达式

答案 1 :(得分:2)

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

I picked it from here.(虽然我投了reg exp的答案)

答案 2 :(得分:2)

您可以尝试在不使用正则表达式的情况下保持简单 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

答案 3 :(得分:1)

你可以写一个像

这样的函数
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发布的解决方案

答案 4 :(得分:0)

据我所知,您需要创建一个进程(或用户定义的函数)来清理列,以便您可以将其实际转换为INT或其他适当的数据类型,然后您可以获取最大值。

答案 5 :(得分:0)

通过使用用户定义的函数将值解析为int,然后运行select。

SELECT MAX(dbo.parseVarcharToInt(column)) FROM table

答案 6 :(得分:0)

SELECT dbo.RegexReplace('[^0-9]', '','a5453b',1, 1)

和像杰森科恩一样的RegexReplace安装说

答案 7 :(得分:0)

这是一个老问题,我知道 - 但要为其他人添加知识库......

假设您的所有值中至少包含1个数字:

Select max(convert(int, SubString(VarName, PATINDEX('%[0-9]%',VarName), Len(VarName))))
from ATable

答案 8 :(得分:0)

这是我的简单答案。你可以尝试一下。但是它适用于固定的可移动字符串值。

select max(cast(SUBSTRING(T.column,3,len(T.column)) as int)) from tablename T