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
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
对于 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
你可以试试这个可怕的东西。这证明将这些值存储在两个字段中会更好......
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
尝试这个:
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
您应该澄清您的订购类型。例如,在 14AA 中,您说第一部分解释为数字,第二部分解释为字母!
如果你想混合它们,我建议使用 HEX 基础。