SQL 服务器 2014-2016 [nvarchar] 的顺序不正确

SQL Server 2014-2016 Incorrect order by [nvarchar]

SELECT ItemNo FROM Stock Order By ItemNo Desc



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

以前没注意过这个。 nvarchar类型是按照第一个字符对字段进行排序..我想按整个单词怎么办?

如果您正在对 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.

试试这个:

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

您的列是 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 列

如果您有 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