Sql 从“不返回最大值”列中选择“最大值”

Sql 从“不返回最大值”列中选择“最大值”,sql,sql-server,Sql,Sql Server,我正在运行sql查询,以将列中的最大值返回给程序 我运行的sql查询是 select MAX([Line No]) from table 我正在使用SQLServer2008 该表有3行,“行号”的值为50、90、100 我希望返回的最大值是100, 但是我快90岁了……为什么 编辑: 您的列可能不是数字类型,而是字符串类型(char、nchar、varchar、nvarchar)。所以,它是按字母顺序排序的,9在1之后 最简单的方法是更改该列的正确数据类型。如果不能这样做,则需要在MAX中转

我正在运行sql查询,以将列中的最大值返回给程序

我运行的sql查询是

select MAX([Line No]) from table
我正在使用SQLServer2008

该表有3行,“行号”的值为50、90、100

我希望返回的最大值是100, 但是我快90岁了……为什么

编辑:


您的列可能不是数字类型,而是字符串类型(char、nchar、varchar、nvarchar)。所以,它是按字母顺序排序的,9在1之后

最简单的方法是更改该列的正确数据类型。如果不能这样做,则需要在
MAX
中转换回正确的类型

例如:

如果该列中的某些值无法转换为要过滤掉的数字,则可以执行以下操作:

select max(cast ([Line No] as int)) 
from table 
where isnumeric([Line No]) = 1
或者,要仅显示非数值,以便修复它们,可以执行以下操作:

select *
from table 
where isnumeric([Line No]) = 0

有关更健壮的整数检测,请参阅本文:

您的列可能不是数字类型,而是字符串类型(char、nchar、varchar、nvarchar)。所以,它是按字母顺序排序的,9在1之后

最简单的方法是更改该列的正确数据类型。如果不能这样做,则需要在
MAX
中转换回正确的类型

例如:

如果该列中的某些值无法转换为要过滤掉的数字,则可以执行以下操作:

select max(cast ([Line No] as int)) 
from table 
where isnumeric([Line No]) = 1
或者,要仅显示非数值,以便修复它们,可以执行以下操作:

select *
from table 
where isnumeric([Line No]) = 0
有关更健壮的整数检测,请参阅本文:

UPADTE:
SqlCommand
上调用
ExecuteScalar
,而不是
GetSring

int max = (int)myCommandlineno.ExecuteScalar();
UPADTE:
SqlCommand
上调用
ExecuteScalar
,而不是
GetSring

int max = (int)myCommandlineno.ExecuteScalar();

正如RedFilter的回答,它可能是另一种类型。将列值强制转换为数字类型,然后应用Max函数

select MAX(CAST(LineNo AS INT) from table

正如RedFilter的回答,它可能是另一种类型。将列值强制转换为数字类型,然后应用Max函数

select MAX(CAST(LineNo AS INT) from table

要从文本数据中获取数值最大值,必须强制转换以下值:

select max(cast([Line No] as int)) from table

要从文本数据中获取数值最大值,必须强制转换以下值:

select max(cast([Line No] as int)) from table

如果列中有其他无法转换为int的字母数字值,并且希望忽略它们,但仍希望向代码返回字符串,则可以执行以下操作:

select cast(max(cast(LineNo AS int) as varchar(10))
from table
where isnumeric([LineNo] = 1)

但是,如果该列打算保存整数,我建议您安排一些开发时间来更改列类型,并将任何非整数迁移到可接受的值。如果不使用正确的数据类型,您可能会遇到麻烦。

如果列中有其他无法转换为int的字母数字值,您想忽略它们,但仍想向代码返回字符串,则可以执行以下操作:

select cast(max(cast(LineNo AS int) as varchar(10))
from table
where isnumeric([LineNo] = 1)

但是,如果该列打算保存整数,我建议您安排一些开发时间来更改列类型,并将任何非整数迁移到可接受的值。如果不使用正确的数据类型,您可能会陷入麻烦。

啊,是的,它是字符串类型!那么,我可以用什么样的查询来代替呢?我无法更改表中的列
select MAX(CAST([Line No]as int))的数据类型。应该这样做。@初学者看到我上面关于如何过滤坏值的更新,我认为这是因为我仍在使用reader.getstring而不是int?错误消息应该会给你一个线索。(除非你正在吃它,就像上面的代码一样…)啊,是的,它是字符串类型!那么,我可以用什么样的查询来代替呢?我无法更改表中的列
select MAX(CAST([Line No]as int))的数据类型。应该这样做。@初学者看到我上面关于如何过滤坏值的更新,我认为这是因为我仍在使用reader.getstring而不是int?错误消息应该会给你一个线索。(除非您正在吃它,就像在上面的代码中一样…)System.Data.SqlTypes.SqlNullValueException:数据为Null。无法对Null valuesSystem.Data.SqlTypes.SqlNullValueException调用此方法或属性:数据为Null。无法对空值调用此方法或属性请参见
ExecuteScalar
上的我的更新查看
ExecuteScalar
上的我的更新,因为它现在是一个整数,而不是字符串。使用
GetInt32
获取值。此外,要检查空值,应使用
IsDbNull
方法,而不是将值与
null
进行比较。数据库驱动程序从不返回
null
值,它返回
DbNull
值。这是因为它现在是一个整数,而不是字符串。使用
GetInt32
获取值。此外,要检查空值,应使用
IsDbNull
方法,而不是将值与
null
进行比较。数据库驱动程序从不返回
null
值,它返回
DbNull
值。