从 varchar 列中选择最大的整数

17
我正在尝试从一个包含数字和字符串的varchar列中检索最大的数字。以下是我正在处理的数据示例:
BoxNumber 123 A5 789 B1
我需要从该列返回最大的数字(在本例中为789),同时忽略A5和B1等非数字值。
我已经找到了使用自定义函数解决问题的解决方案,但我需要一些可以执行ad-hoc查询而不依赖于自定义函数或过程的东西。
10个回答

31
由于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问题的文章。


9
你可以尝试
Select MAX(BoxNumber) from {table} where IsNumeric(BoxNumber) = 1

如果这个查询会经常使用,请确保评估它的性能。 - Michael Haren
1
不能使用Isnumeric,运行此命令以查看我的意思 选择isnumeric('+'),isnumeric('5d2') - SQLMenace

7

为什么不呢?

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

今日免费次数已满, 请开通会员/明日再来

4
所选答案对我很有用,直到我将此值与示例中的其他值一起添加到临时表中:
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 '%.%'

我想将其用于多个最大值,这些最大值都来自不同的列。我该怎么做? - Parth Sane

2

当值为'+'和'-'时,建议使用此解决方案进行检查,因为我认为IsNumeric函数可能会返回1。


2

在这个问题被提出的11年间,SQL Server引入了try_cast函数,如果转换失败则返回null而不是抛出错误。因此,在当前版本的SQL Server中,一个有效的答案是:

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

1

谢谢您的建议。不幸的是,它出现了错误:将 nvarchar 值“A5”转换为 int 数据类型的列时出现语法错误。 - Chris Van Opstal

1
这些答案只对了一半。它们成功地隔离了数字值,但没有意识到当底层字段是数字时,Max函数会作为字符进行评估(无论强制转换),从左到右阅读,因此789 > 1000,因为7 > 1。解决这个问题的方法可能是忘记强制转换,并在数字左侧填充零以获得公共长度,当Max处于字符模式时应该有效。

看起来像 SQLMenace 这样将其转换为 int 的解决方案是正确的。您在哪个版本的 SQL Server 中发现这种方法不起作用? - Chris Van Opstal

0
select max(cast(column as numeric)) from table 

在PostgreSQL中,将varchar列转换为numeric类型


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

在 MySql 中

为了正确地进行类型转换,您应该使用 signed 而不是 int。

注意,在 MySql 中所使用的类型可能会有所不同。

如需更多转换,请访问this链接。


1
这个问题是关于SQL Server / T-SQL的,不是MySQL。SQL Server没有“signed”数据类型。 - Bill Jetzer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接