Select number
from tableName
order by Number
它显示象下面字母数字和特殊字符在SQL Server 2008的排序
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
它显示象下面字母数字和特殊字符在SQL Server 2008的排序
1
10
11
14
14A
14AA
19
2
20
21
相反,它应该显示类似下面
1
2
10
11
14
14A
14AA
19
20
你可以试试这个可怕的事情。这证明,这将是更好地将这些值存储在两个领域...
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
对于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
我不能说所有的例子,但SQL服务器部分失败 –
@ t-cl你有什么定义'失败'? http://sqlfiddle.com/#!3/d127c/3/0 – RichardTheKiwi
这真的很奇怪,每当我在2008年运行你的脚本时都会失败。'转换失败时将varchar值'14AA'转换为数据类型int “。 –
你应该澄清你的订单类型。例如在14AA中,你说第一部分解释为数字,第二部分解释为字母!
如果你想混合他们,我建议使用HEX基地。
试试这个:
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
@Downvoter - 给评论简单downvoting将不是一个好的做法 – AnandPhadke
我appologize我的数据库是有趣的。出于某种原因,它给出了错误的结果。与@RichardTheKiwi一样的错误 –
你有'14A'和'14AA'在你的电话号码列时,它把该列数据为字符。 – osyan