我在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并且具有数字和文本部分。有没有办法对此进行排序?将它分成子串似乎是一个不好的选择,因为每个部分的长度(文本和数字)不是恒定的。
谢谢!
答案 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函数重新创建该表,并将其分为两列。在继续这里之前,您应该阅读三个级别的规范化数据库。