我有一个带有nvarchar列的表。此列具有值,例如:
等等。
我想把这个值的MAX,但不是文本,而是来自数字。所以在这个例子中,数字是:
MAX值是最后一个--3546。如何在Microsoft SQL上的TSQL中执行此操作?
答案 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)
您可以尝试在不使用正则表达式的情况下保持简单
这是来源
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