【问题标题】:SQL Server 2014-2016 Incorrect order by [nvarchar]SQL Server 2014-2016 [nvarchar] 的顺序不正确
【发布时间】:2017-11-27 08:19:12
【问题描述】:
SELECT ItemNo FROM Stock Order By ItemNo Desc



   ItemNo
----------
1        3
2        2
3        1
4       10

我以前从来没有关注过这个。 nvarchar类型按照第一个字符对字段进行排序..我要按照全字来做怎么办?

【问题讨论】:

  • 在整数列中存储数字...
  • nvarchar 列
  • 这是一个糟糕的桌子设计。我说将整数存储在整数列中。
  • 对不起.. 可以添加到像“A10”这样的值
  • 是的。字符串类型使用 string 排序规则。为什么这令人惊讶?由于您在此列中显然混合了数字和非数字值,您能否清楚地定义当这些值混合存在时您希望应用哪些规则?

标签: sql sql-server sql-order-by


【解决方案1】:

如果您正在对varchar 类型的列进行排序,并且如果它是数字形式,那么您可以在order by 子句中将其转换为整数。

查询

如果在升序或

select [ItemNo] from [Stock] 
order by cast([ItemNo] as int);

降序,

select [ItemNo] from [Stock] 
order by cast([ItemNo] as int) desc;

另外一种方式,

查询

对于升序,

select [ItemNo] from [Stock] 
order by len([ItemNo]), [ItemNo];

降序,

select [ItemNo] from [Stock] 
order by len([ItemNo]) desc, [ItemNo] desc;

注意:建议您将数字存储在列类型INT

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT ItemNo 
    FROM Stock 
    Order By CAST(ItemNo AS INT) Desc
    

    【讨论】:

      【解决方案3】:

      您的列是 nvarchar,因此它将数字视为字符串并将其排序为字母 尝试像下面这样投射

      SELECT ItemNo FROM Stock Order By CAST(ItemNo AS INT) Desc
      

      这里是官方信息

      https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql

      但我建议您将 Int Columns 用于 Item No

      如果您有 alpha 数字值,请使用此

      SELECT ItemNo ,
              CASE WHEN PATINDEX('%[0-9]%',ItemNo ) > 1 THEN
                LEFT(ItemNo ,PATINDEX('%[0-9]%',ItemNo )-1)
              ELSE 
                ItemNo 
              END As alphabetical_sort, -- alphabetical sort
              CASE WHEN PATINDEX('%[0-9]%',ItemNo ) > 1 THEN
                CAST(SUBSTRING(ItemNo ,PATINDEX('%[0-9]%',ItemNo ),LEN(ItemNo )) as float)
              ELSE
                NULL
              END As Numeric_Sort
      FROM dbo.Stock 
      ORDER BY alphabetical_sort, Numeric_Sort
      

      【讨论】:

      • tnx.不只是数字
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多