在字符串末尾用数字排序

时间:2011-08-11 05:28:06

标签: sql sqlite

我有一张名为“员工1”,“员工2”,“员工3”等名称的表,最后是“员工10”,员工11“,”员工12“。

当我访问所有名称时,它就像员工1,员工10,员工11,员工12,员工2,员工3等等。

即使我使用“按ID排序”或“按名称排序”,员工10先是员工1,员工2和儿子,最后是员工11,员工12。

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

请注意,排序是使用字母 ASCIIable排序完成的。排序无法识别“员工”一词后面有数字,而是将每个数字作为单独的字符处理。

我期望的顺序是

Employee 1
Employee 10 
Employee 2
...
Employee 9 

因为订单是由

定义的
  1. 如果字符串A中的character_n位于字符串B中的character_n之前,则字符串A位于字符串B之前,反之亦然。如果字符相等,则继续
  2. 如果在字符串B中有更多字母时达到字符串A的结尾,则字符串A在字符串B之前出现,反之亦然。否则转到第1步。
  3. 例如:

    • 员工1比员工10短,而直到字符串结尾为止。
    • 员工10来自员工2,因为1按字母顺序排在2之前。

答案 1 :(得分:1)

正如Aleksi Yrttiaho已经说过的那样,员工10出现在员工2之前是完全正常的。如果你想对字符串进行排序,你必须接受有设定的规则,它不能做你想要的只是因为你喜欢它以这种方式工作。

如果您要从最旧到最近订购员工,则必须创建另一列。我建议约会(员工加入公司的日期)。可以建议增量ID,但我认为这不是最好的解决方案。有一天,您可能会认为您自己是一名员工,并在包含您的信息的表格中添加一行,您将无法正确排序。

答案 2 :(得分:1)

如果数字前面的字符串总是相同的长度(例如,它总是'员工'),您可以使用以下内容:

DateTime_match,DateTime_odds,sport,team,team_type,odds

05/11/2015 16:00:00,01/11/2015 10:37:58,NFL,New York Giants,home,1.21

05/11/2015 16:00:00,01/11/2015 10:37:58,NFL,New Orleans,away,3.5

答案 3 :(得分:0)

   SELECT g.groupid,
          g.groupname,
          SUBSTRING(g.groupname, 1, PATINDEX('%[0-9]%', g.groupname + '0') - 1) grouptext, 
CASE WHEN ISNUMERIC(SUBSTRING(g.groupname, PATINDEX('%[0-9]%', g.groupname + '0'), 100) + '.0e0') IS NOT NULL 
     THEN SUBSTRING(g.groupname, PATINDEX('%[0-9]%', g.groupname + '0'), 100) 
     ELSE 0 END groupnum
     FROM Groups g
 ORDER BY grouptext, groupnum;