2012-10-09 171 views

回答

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

+0

这是不正确的。它会把'20'放在'14AA'之前。 – RichardTheKiwi

+0

@RichardTheKiwi你是对的,编辑过。 –

+0

仍然不起作用 –

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 
+0

我不能说所有的例子,但SQL服务器部分失败 –

+0

@ t-cl你有什么定义'失败'? http://sqlfiddle.com/#!3/d127c/3/0 – RichardTheKiwi

+0

这真的很奇怪,每当我在2008年运行你的脚本时都会失败。'转换失败时将varchar值'14AA'转换为数据类型int “。 –

0

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

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

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 
+0

@Downvoter - 给评论简单downvoting将不是一个好的做法 – AnandPhadke

+0

我appologize我的数据库是有趣的。出于某种原因,它给出了错误的结果。与@RichardTheKiwi一样的错误 –