【问题标题】:order by 1.99.10 and 1.99.9 sql server按 1.99.10 和 1.99.9 sql server 排序
【发布时间】:2013-05-17 09:35:56
【问题描述】:

抱歉我的错误,我应该提供问题的真实样本,我的 ID 包含字符:

示例代码:

select ID from student order by ID

Expected output from mine          but system output
-------------------------          -----------------
JAD.1.99.9                             JAD.1.99.10
JAD.1.99.10                            JAD.1.99.9

而这个ID 是nvarchar 类型。

【问题讨论】:

标签: sql sql-server-2008


【解决方案1】:

Yesterday 有一个类似的问题,我了解到您可以使用hierarchyid 进行版本排序(如果您至少使用 SQL-Server 2008):

SELECT id 
FROM   student 
ORDER  BY Cast('/' + Replace(id, '.', '/') + '/' AS HIERARCHYID) 

DEMO

【讨论】:

  • 感谢蒂姆……你的回答很完美……它提高了知识……以正确的方式……
  • +1 您也可以使用没有替换功能的 ORDER BY 子句:ORDER BY Cast('/' + id + '/' AS HIERARCHYID)。演示:sqlfiddle.com/#!3/e3cb1/13
【解决方案2】:

您需要在任何点之后按部分的子字符串排序。这将是一个特定于数据库的 SQL 查询,由于您没有提及您使用的是哪一个,因此我无法给出详细的 SQL 示例。

这就是你可以转换小数值的方法

http://www.w3resource.com/sql/aggregate-functions/avg-decimal-places-using-cast-within-avg.php

蒂姆的回答是最好的..

但我提供了另一种用于 order varchar 值的解决方案 --

SELECT id 
FROM   student 
ORDER  BY ID desc

【讨论】:

  • 这不会返回 user2098512 想要的内容
  • 您不能仅仅因为 OP 的结果排序错误而颠倒顺序。现在,即使 id 是 1.99.8 和 1.99.9,您也总是按降序排序。这也不是版本排序。只需使用以2.1 开头的1.1.1 和2.1 进行测试。
  • 请看这个例子:sqlfiddle.com/#!3/c3fbc/1 来理解为什么这个答案是完全错误的。我无法理解这被投票了 3 次。
猜你喜欢
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多