从列中选择最大数字不会返回最大值

时间:2012-01-13 16:18:16

标签: sql sql-server

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

我运行的SQL查询是..

select MAX([Line No]) from table

我正在使用sql server 2008。

该表有3行,'行号'的值为50,90,100

我希望返回的最大值是100, 但我得到90 ..为什么?

编辑:

  string LineNo = "0";

   //LineNo
   string SQLlineno = "select MAX(CAST([Line No] As Int)) from Saved_Order_Import where [order no] = '"
                      + ordernumber + "'";
   SqlCommand myCommandlineno = new SqlCommand(SQLlineno, myConnection);
   SqlDataReader readerline;
   try
   {
       readerline = myCommandlineno.ExecuteReader();
       if (readerline.HasRows)
       {
           while (readerline.Read())
           {
               try
               {
                   if (readerline.GetString(0) != null)
                   {
                       LineNo = (readerline.GetString(0) + 10).ToString();
                   }
               }
               catch (Exception ex) { return "{\"error\":\"line : " + ex.ToString() + "\"}"; }
           }
       }
       readerline.Close();
   }
   catch (Exception ex)
   {
      // return "{\"error\":\"Other One11" + ex.ToString() + "\"}";
   }

5 个答案:

答案 0 :(得分:6)

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

最简单的方法是更改​​为该列的正确数据类型。如果你不能这样做,你需要在MAX内回到正确的类型。

如,

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

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

select max(cast ([Line No] as int)) 
from table 
where isnumeric([Line No]) = 1

或者,要仅显示非数字值,以便您可以修复它们,您可以执行以下操作:

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

有关更强大的整数检测,请参阅此文章:Can I Convert This String to an Integer?

答案 1 :(得分:1)

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

<强> UPADTE: 拨打ExecuteScalar上的SqlCommand而不是GetSring

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

答案 2 :(得分:0)

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

select MAX(CAST(LineNo AS INT) from table

答案 3 :(得分:0)

要从文本数据中获取数字maximium,您必须转换值:

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

答案 4 :(得分:0)

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

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

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