mysql排序包含char和数值的varchar字段

时间:2013-02-18 14:11:58

标签: mysql sorting varchar

我在SQL中有以下数据:

name       ID  
 A[0]       1  
 A[1]       1  
 A[2]       1  
 AA[0]      2  
 AA[15]     2   
 AA[27]     2

我想先按ID然后按名称对这些数据进行排序。按ID排序很容易,因为它是一个int,问题在于名称 - 我得到奇怪的值,例如a [7],a [27],a [3]当我试图按数字排序时。在按字母方式排序时,我得到了你所期望的,[10],[11] ...... [19],[2]等等 我假设这是因为该字段是varchar并且具有数字和文本部分。有没有办法对此进行排序?将它分成子串似乎是一个不好的选择,因为每个部分的长度(文本和数字)不是恒定的。
谢谢!

2 个答案:

答案 0 :(得分:1)

根据您的要求,您可以考虑将列拆分为两部分(即A [20]将成为A和20)并按生成的拆分值组合排序。

所以你的查询看起来像id,name-first part(通过拆分或获取子串获得),to_number(name-second part)

答案 1 :(得分:-2)

好的,你想要创建一个像这样使用的函数或者在名字字段上使用子字符串

CREATE FUNCTION SPLIT_STR(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '');

参见参考资料 - http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/

但是还应该注意的是,如果你发现自己不得不拆分列,这将在未来为你提出查询性能问题,因为底层数据库设计存在缺陷。我将使用split函数重新创建该表,并将其分为两列。在继续这里之前,您应该阅读三个级别的规范化数据库。

也 - Split value from one field to two