--问个问题,帮我分析一下吧,这个排序问题挺让人费解:create table aaaaa(c varchar(32))
insert aaaaa
select '-'
union all select '0'
union all select 'c'
union all select 'ckc008'
union all select 'ckc-008'
union all select 'ckc008_' select
c
from aaaaa
order by c
--最后查询出来的结果却是:-
0
c
ckc008
ckc-008
ckc008_--到底排序规则中 0 比 - 靠前呢,还是 - 比 0 靠前……
insert aaaaa
select '-'
union all select '0'
union all select 'c'
union all select 'ckc008'
union all select 'ckc-008'
union all select 'ckc008_' select c from aaaaa order by c
/*
c
--------------------------------
-
0
c
ckc008
ckc-008
ckc008_(所影响的行数为 6 行)
*/select c from aaaaa order by c desc
/*
c
--------------------------------
ckc008_
ckc-008
ckc008
c
0
-(所影响的行数为 6 行)
*/select c from aaaaa order by case when c <> '-' then 1 else 2 end
/*
c
--------------------------------
0
c
ckc008
ckc-008
ckc008_
-(所影响的行数为 6 行)
*/drop table aaaaa
else print '>'
if '-0'<'0' print '<'
else print '>'
-
0
或者
ckc008
ckc-008
进行排序时,能够符合同样的排列顺序,数据库中 0 和 - 的排序顺序不是固定的吗?
那我只好找个临时的解决方法了,代码如下:create table aaaaa(c varchar(32))
insert aaaaa
select '-'
union all select '0'
union all select 'c'
union all select 'ckc008'
union all select 'ckc-008'
union all select 'ckc008_' select
c
from aaaaa
order by
replace(c,'-','_')
/*
执行结果为:-
0
c
ckc-008
ckc008
ckc008_*/
以下是排序后的数据
-
--
---
$
$-$
%^
%4
*
*&^
**
*_*
*0
*7*
/1
\-/
\_/
^
^%
^^
^-^
-_-
-_,-
-0
--0
-0-
0-
0**
0*K
0_11
0-0
000
0000000000
001
00-1
001-
1
-1
---1
1-
1*
1*1
1/1
1^1
1_
10
11
1-1
111
111111111
22222222
3333333
444444
55555
6666
777
88
9
T-T
-W-
'-'<'0'
'-0'>'0'
'-0'<'00'
'-00'>'00'
'-00'<'000'
因此对于带-的在相同字符数的前题下-比0以及其他数小,但只要带-的字符数大于不带-的则系统判定为带-的大
所以还是不要用-的好
PS:
'ckc-008'>'ckc008' 带-的字符数比不带着-的多
'ckc-008'<'ckc008-' 带-的字符数比不带着-的少
楼主可以使用一下collate,这个查询结果应该是你想要的。
具体的原因,你查一下collate相关的资料就可以明白一些了。
查询下C的默认collate ,所有的字段排列都是按照collate排列的
虾哥的提示非常有益处,但是因为时间紧迫,我并没有找到合适的排序规则,
而是采用了替换字符的办法,目前暂时解决了,
order by replace (c,'-','0')