0

我在 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]。当按字母排序时,我得到了您所期望的 a[10],a[11]...a[19],a[2] 等
我认为这是因为该字段是 varchar 并且具有数字和文本部分. 有没有办法对此进行排序?将其拆分为子字符串似乎是一个糟糕的选择,因为每个部分(文本和数字)的长度不是恒定的。
谢谢!

4

2 回答 2

1

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

因此,您的查询将看起来像按 id、名称第一部分(通过拆分或获取子字符串获得)、to_number(名称第二部分)排序

于 2013-02-18T14:17:16.693 回答
-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 函数重新创建该表并将其分成两列。在继续之前,您应该阅读三个级别的规范化数据库。

也 -将值从一个字段拆分为两个

于 2013-02-18T14:14:16.967 回答