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
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