0
Select number 
from tableName 
order by Number

它显示如下

1
10
11
14
14A
14AA
19
2
20
21

相反,它应该显示如下

1 
2
10
11
14
14A
14AA
19
20
4

4 回答 4

3

对于 PostgreSQL 和 SQL Server,我假设您的列仅包含字母数字。

MySQL 和 SQLite

ORDER BY StrangeCol*1, StrangeCol

PostgreSQL

order by cast(trim(both 'abcdefghijklmnopqrstuvwxyz'
                   from lower(StrangeCol)) as int), StrangeCol

SQL 服务器

order by 0+stuff(StrangeCol+'a',patindex('%[a-Z]%',StrangeCol+'a'),999,''), StrangeCol

甲骨文

order by 0+regexp_replace(StrangeCol, '[^[:digit:]]') ,StrangeCol
于 2012-10-09T07:58:44.413 回答
2

你可以试试这个可怕的东西。这证明将这些值存储在两个字段中会更好......

ORDER BY
CAST(SUBSTRING(Number, 0, 
  case when patindex('%[a-zA-Z]%', Number) = 0 
  then len(Number)+1
  else patindex('%[a-zA-Z]%', Number)
  end) 
as INT),
Number

SqlFiddle

于 2012-10-09T07:54:13.427 回答
2

尝试这个:

create table tblNum(id varchar(10))

insert into tblNum 
values('1'),('10'),('11'),('14'),('14A'),('14AA'),('19'),('2'),('20'),('21')

select id from tblNum order by 
CASE WHEN PATINDEX('%[a-zA-Z]%',id) > 0 then cast(left(id,(PATINDEX('%[a-zA-Z]%',id)-1)) as int) else cast(id as int) end 
于 2012-10-09T08:32:41.640 回答
0

您应该澄清您的订购类型。例如,在 14AA 中,您说第一部分解释为数字,第二部分解释为字母!

如果你想混合它们,我建议使用 HEX 基础。

于 2012-10-09T08:01:55.127 回答