代码之家  ›  专栏  ›  技术社区  ›  MindingData

Transact-SQL中的数字排序依据(以字符串而不是int排序)

  •  1
  • MindingData  · 技术社区  · 16 年前

    我有一个问题,我试图通过我认为是数据库中数字列的内容来排序结果集。但是,当我得到结果集时,它将列排序为字符串(按字母顺序排列),而不是将其排序为int。

    作为一个例子。我有这些数字,

    1,2,3,4,5,10,11

    当我在Transact-SQL中排序时,我返回:

    1,10,11,2,3,4,5

    前一段时间,我对DataGridView也有同样的问题,问题是因为排序就像字符串一样进行。我想这里也发生了同样的事情。

    我的完整SQL代码是:

    SELECT  TOP (12) DATEPART(YEAR, [OrderDate]) AS 'Year',  DATEPART(MONTH, [OrderDate]) AS 'Month' , COUNT(OrderRef) AS 'OrderCount'
    FROM [Order]
    WHERE [Status] LIKE('PaymentReceived') OR [Status] LIKE ('Shipped')
    GROUP BY  DATEPART(MONTH, [OrderDate]), DATEPART(YEAR, [OrderDate])
    ORDER BY DATEPART(YEAR, OrderDate) DESC, DATEPART(MONTH, OrderDate) desc
    

    做笔记 只有当我从Visual Studio调用函数时,才会发生错误的排序。我的代码是:

    using (SqlConnection conn = GetConnection())
                {
                    string query = @"SELECT  TOP (12) DATEPART(YEAR, [OrderDate]) AS 'Year',  DATEPART(MONTH, [OrderDate]) AS 'Month' , COUNT(OrderRef) AS 'OrderCount'
                                    FROM [Order]
                                    WHERE [Status] LIKE('PaymentReceived') OR [Status] LIKE ('Shipped')
                                    GROUP BY  DATEPART(MONTH, [OrderDate]), DATEPART(YEAR, [OrderDate])
                                    ORDER BY DATEPART(YEAR, OrderDate) DESC, DATEPART(MONTH, OrderDate) desc";
                    SqlCommand command = new SqlCommand(query, conn);
                    command.CommandType = CommandType.Text;
    
                    using (SqlDataReader reader = command.ExecuteReader())
    

    等等。当我在SQL Server中运行该语句时,没有问题。

    我目前正在使用SQL Server 2005 Express Edition和Visual Studio 2005。

    我尝试过许多散布在网络上的东西。包括使用convert()和abs()无效。

    任何帮助都将不胜感激。

    编辑:有人提出了在数据阅读器返回他们之后我对他们做了什么的问题…

    我在“results”名称下使用sortedList变量。

    using (SqlDataReader reader = command.ExecuteReader())
    {
    while (reader.Read())
    {
    string Date = reader["Year"].ToString() + "/" + reader["Month"].ToString();
    string Orders = reader["OrderCount"].ToString();
    results.Add(Date, Orders);
    }
    }
    

    希望它有帮助。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Cade Roux    16 年前

    您确定它们实际上是以预期(int)以外的顺序从您的DataReader返回的吗?信任但验证(在调试器中)。

    您还没有向我们展示您是如何将它从数据阅读器中取出的,以及您将它放入的内容。

    如果将它们放入某种有序集合中,其中int列(可能是隐式地)转换为字符串(例如, Dictionary<string, string> ,您将看到与在数据报中看到的相同的问题,而不管它们从数据阅读器返回的顺序如何。在这种情况下,同样,这不是真正的SQL/SQLClient问题。

        2
  •  1
  •   mynameiscoffey    16 年前

    您是否尝试使用cast(value as int)?

    如: order by cast(datepart(year, OrderDate), int) ?

        3
  •  0
  •   Oleks    16 年前

    你试过用强制转换字符串吗? STR 函数返回右对齐结果,因此在任何情况下顺序都应正确:

    ORDER BY STR(DATEPART(YEAR, OrderDate), 4, 0) DESC,
             STR(DATEPART(MONTH, OrderDate), 2, 0) DESC