从varchar列中选择max int

时间:2009-02-04 18:48:27

标签: sql-server tsql

我正在尝试从varchar列中检索包含数字和字符串的最大数字。我正在使用的数据示例:

BoxNumber
123个
A5
789个
B1

我需要从列中返回最大数字(在这种情况下为789),同时忽略A5和B1的非数字值。

我找到了使用custom functions来解决问题的解决方案,但是我需要一些可以执行即席查询而不依赖于自定义函数或过程的东西。

9 个答案:

答案 0 :(得分:26)

你需要一个组合,因为isnumeric为以下事情返回1

select isnumeric('+'),isnumeric('5d2') 

你的where子句就像这样

WHERE VALUE NOT LIKE '%[a-z]%'
        AND ISNUMERIC(VALUE) = 1

create table #bla (value varchar(50))
insert #bla values('123')
insert #bla values('a5')
insert #bla values('789')
insert #bla values('b1')

SELECT MAX(CAST(value AS Int)) FROM #bla
WHERE VALUE NOT LIKE '%[a-z]%'
    AND ISNUMERIC(VALUE) = 1

我在这里写了ISNUMERIC Trouble

答案 1 :(得分:8)

您可以尝试

Select MAX(BoxNumber) from {table} where IsNumeric(BoxNumber) = 1

答案 2 :(得分:4)

为什么不

SELECT MAX(CAST(Value AS Int)) FROM #bla 
WHERE ISNUMERIC(Value)=1 
    AND Value LIKE '%[0-9]%' 

然后你只处理数字字符串。在这种情况下,您可能不需要ISNUMERIC()

答案 3 :(得分:3)

所选答案对我有用,直到我将此值与样本中的其他值一起添加到临时表中:

insert #bla values('1234')

我预计我的max()结果现在是1234,但它仍然是789.也许这是由于一些整理设置,但我能够在多个数据库上重现。我发现下面的查询对我有用,但我当然有兴趣听听是否有更有效的方法。此外,我不想包含任何小数值,所以我也排除了任何一个句号。

SELECT MAX(CAST(Value AS Int)) FROM #bla 
WHERE ISNUMERIC(Value)=1 
    AND Value NOT LIKE '%[a-z]%' 
    AND Value NOT LIKE '%.%'

答案 4 :(得分:2)

您应该检查此解决方案的值是否为'+'和' - ',因为我认为IsNumeric函数可能会为这些值返回1

答案 5 :(得分:1)

查看将列转换为int,然后选择MAX()。我不知道它会对包含字母的列做什么,但值得探讨。

http://doc.ddart.net/mssql/sql70/ca-co_1.htm

答案 6 :(得分:1)

这些答案只有一半是正确的。他们成功地隔离了数值,但是没有意识到当底层字段是数字时,Max函数评估为字符(无论是否为强制转换),从左到右阅读,以便789> 1000因为7> 1.解决这个问题的方法可能是忘记进行投射,并在字符模式下的Max应该工作时,将数字用零填充到一个公共长度。

答案 7 :(得分:1)

好吧,自问这个问题以来的11年间,SQL Server获得了try_cast函数,该函数返回null而不是如果转换失败不抛出错误。因此,在当前版本的SQL Server中,有效的答案是

select max(try_cast(BoxNumber as int)) from theTable

答案 8 :(得分:0)

SELECT MAX(CAST(value as signed)) FROM yourTable
WHERE VALUE NOT LIKE '%[a-z]%'
AND ISNUMERIC(VALUE) = 1

在MySql中

您应使用signed而不是int进行正确投射。

用于投射的P.s类型在MySql中可能有所不同

要获取更多转化,请访问this链接