SQL Server 2005中如何对nvarchar列进行排序

3
当对包含数字值的nvarchar列进行排序时,SQL Server返回错误的排序结果,我不知道为什么!是否有特定的方式让SQL Server对varchar列中包含数字值的进行排序呢?谢谢。

4
nvarchar列将作为字符串进行排序 - 排序方式并不“糟糕” - 这是按设计的方式排序。 如果您有数值数据,请将其存储在数字列中! - marc_s
如果将数字值存储为nvarchar,按int排序可能并不理想。这些值通常是连接的,并且具有不同的含义,而不仅仅是升序或降序。 - TheTechGuy
4个回答

3
这个功能具有故障保护措施,会考虑非数字值并将它们放置在结果集的末尾。
SELECT [nvarcharColumn]
FROM [Table]
ORDER BY CAST(ISNULL(NULLIF(ISNUMERIC([nvarcharColumn]),0),2147483647) as INT)

1
isnumeric并不是一个很好的函数,因为它会在某些符号上返回true,而不仅仅是数字。也许对于他想要的排序来说这没问题。但是你在故障保护方面做得很好,大多数其他答案都忽略了这个小细节... :-) - Chains

2

如果您想按数字排序,您需要将其转换为数字。

这里检查的是在 nVarChar 列中排序的数字列表:

With MyTable AS
(
    Select Cast ('1' as nVarChar) nVarCharColumn UNION 
    Select '100' UNION
    Select '99'
)
Select *
From MyTable
Order by 1

逻辑上来说,99应该在100之前,对吧?但是它是按照nVarChar排序的,所以100中的第一个1比第一个9小,因此它排在99之前。

nVarCharColumn
------------------------------
1
100
99

(3 row(s) affected)

如果使用CAST,则可以得到所需的输出。
With MyTable AS
(
    Select Cast ('1' as nVarChar) nVarCharColumn UNION 
    Select '100' UNION
    Select '99'
)
Select *
From MyTable
Order by CAST (nVarCharColumn as Int)

这是正确的输出

nVarCharColumn
------------------------------
1
99
100

(3 row(s) affected)

表格中出现了一个新情况,如果该列中还有字符串值呢?

;With MyTable AS
(
    Select Cast ('1' as nVarChar) nVarCharColumn UNION 
    Select '100' UNION
    Select '99' UNION
    Select 'String Value'
)
Select *
From MyTable
Order by CAST (nVarCharColumn as Int)

错误!!
Msg 245, Level 16, State 1, Line 22
Conversion failed when converting the nvarchar value 'String Value' to data type int.

因此,SORT 部分检查 IsNumeric - 在 SELECT 部分中不需要再执行相同的操作。

With MyTable AS
(
    Select Cast ('1' as nVarChar) nVarCharColumn UNION 
    Select '100' UNION
    Select '99' UNION
    Select 'String Value'
)
Select *
From MyTable
Order by CAST ( Case When ISNUMERIC (nVarCharColumn)=1 Then nVarCharColumn Else -99 End as Int)

获取正确的输出
nVarCharColumn
------------------------------
String Value
1
99
100

(4 row(s) affected)

基本上是@curt的答案,但解释得非常好。 - Chains

0

你可以将数字中的值进行类型转换,例如 int 或 float。

SELECT nVarCharValue FROM table ORDER BY CAST(nVarCharValue AS INT)

0

你的排序值应该转换为数字值。

ORDER BY CONVERT(INT, YourVarcharCol) ASC

希望这可以帮到你,
约翰

该列包含字符和数字的混合。 - Hadad
@Hadad,请查看我的回答,其中提供了一个解决方案,可以考虑字符和数字:https://dev59.com/_VnUa4cB1Zd3GeqPanaP#6775967 - Curtis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接