5

您好我想对表格进行排序。该字段包含数字、字母和带有字母的数字,即,

1
2
1a
11a
一个
6a
b

我想把这个排序,

1
1a
2
6a
11a
一个
b

我的代码是,

SELECT * FROM tORDER BY CAST(st AS SIGNED), st
但结果是,

一个
b
1
1a
2
6a
11a

我在这个网址中找到了这段代码

" http://www.mpopp.net/2006/06/sorting-of-numeric-values-mixed-with-alphanumeric-values/ "
任何人请帮助我

4

4 回答 4

5

0即使在表格中存在,这也会执行您所需的排序顺序;

SELECT * FROM t 
ORDER BY 
  st REGEXP '^[[:alpha:]].*', 
  st+0, 
  st

一个用于测试的 SQLfiddle

  • 作为第一个排序标准,它将以字母开头的任何内容排序在没有字母开头的内容之后。这就是正则表达式的作用。
  • 作为第二个排序标准,它按字符串开头的数值排序(st+0将 0 添加到字符串开头的数字部分并返回一个 int)
  • 作为最后的手段,它按字符串本身排序以按字母顺序排列。
于 2013-05-04T06:55:14.827 回答
2

你可以使用这个:

SELECT *
FROM t
ORDER BY
  st+0=0, st+0, st

使用st+0varchar 列将被强制转换为 int。排序方式st+0=0会将字母数字行放在底部(如果字符串以字母数字字符开头,st+0=0 将为 1,否则将为 0)

在此处查看小提琴。

于 2013-05-04T06:43:47.400 回答
0

你得到这个输出的原因是所有像'a','b'等字符都被转换为'0',如果你使用ASC的顺序,它会出现在顶部。

SELECT CAST(number AS SIGNED) from tbl

正在返回

1
2
1
11
0
6
0

看看这个小提琴:- SQL FIDDLE

于 2013-05-04T06:42:47.437 回答
-3

我对您的查询做了一些小改动-

SELECT *, CAST(st AS SIGNED) as casted_column
FROM t
ORDER BY casted_column ASC, st ASC

这应该有效。从理论上讲,您的语法应该可以工作,但不确定为什么 mysql 在 from 标记之后不接受这些方法。所以创建了临时字段,然后对该字段进行了排序。

根据我的经验,这应该可以工作,您可以检查一下。

SQL 小提琴

于 2013-05-04T06:33:25.217 回答