SQL Server自然排序?

8

我有一列通常只有数字(有时是字母,但这不重要)。

如何自然排序?

目前的排序方式是:{1、10、11、12、2、3、4、5、6、7、8、9}

我希望它按照以下方式排序:{1、2、3、4、5、6、7、8、9、10、11、12}

3个回答

8

IsNumeric函数存在缺陷,ISNUMERIC(CHAR(13))会返回1,而CAST将会失败。

可以使用ISNUMERIC(textval + 'e0')来解决问题。最终代码如下:

ORDER BY
  PropertyName,
  CASE ISNUMERIC(MixedField + 'e0') WHEN 1 THEN 0 ELSE 1 END, -- letters after numbers
  CASE ISNUMERIC(MixedField + 'e0') WHEN 1 THEN CAST(MixedField AS INT) ELSE 0 END,
  MixedField

您可以混合使用订单参数...


差不多了,这并没有对非数字进行排序,只是随意将它们添加到末尾。我会修改你的查询并接受它。 - Malfist

2
投射它。同时,不要忘记使用IsNumeric确保您只返回数字(如果它们包含字母,则很重要;)。
SELECT textval FROM tablename
WHERE IsNumeric(textval) = 1
ORDER BY CAST(textval as int)

此外,将数据类型转换为可以容纳最大值的数据类型。

如果您还需要结果集中的非数字,则只需在之前或之后附加一个UNION查询,其中IsNumeric = 0(按任何顺序排序)即可。


联合的问题在于这种排序不是第一级排序。第一级排序是按属性名称排序,而这种排序是按单位编号排序(通常是数字,但也可能是A、B、C等)。联合会导致很多偏差。 - Malfist

-3
你尝试过在查询末尾使用以下语句吗:
'OrderBy ColumnName Asc'

8
这不是自然排序,而是ASCII排序。 - Malfist

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