--问个问题,帮我分析一下吧,这个排序问题挺让人费解: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 靠前…… 

解决方案 »

  1.   

    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 
    /*
    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
      

  2.   

    运行这两条,你会发现字符-的排序确实怪:if '-'<'0' print '<'
    else print '>'
    if '-0'<'0' print '<'
    else print '>'
      

  3.   

    不太明白您的方法,我希望在对
    -
    0
    或者
    ckc008
    ckc-008
    进行排序时,能够符合同样的排列顺序,数据库中 0 和 - 的排序顺序不是固定的吗?
      

  4.   

    如果如小楼所说,是 "-" 这个符号的特殊性导致了这个问题,
    那我只好找个临时的解决方法了,代码如下: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,'-','_')
      

  5.   


    /*
    执行结果为:-
    0
    c
    ckc-008
    ckc008
    ckc008_*/
      

  6.   

    做了个实验发现我也开始崩溃了,还真希望那位大大解释下
    以下是排序后的数据
    -
    --
    ---
    $
    $-$
    %^
    %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-
      

  7.   

    关于-的研究出来的其余的还处于混乱中
    '-'<'0'
    '-0'>'0'
    '-0'<'00'
    '-00'>'00'
    '-00'<'000'
    因此对于带-的在相同字符数的前题下-比0以及其他数小,但只要带-的字符数大于不带-的则系统判定为带-的大
    所以还是不要用-的好
    PS:
    'ckc-008'>'ckc008' 带-的字符数比不带着-的多
    'ckc-008'<'ckc008-' 带-的字符数比不带着-的少
      

  8.   

    order by c collate SQL_Latin1_General_Cp437_BIN
    楼主可以使用一下collate,这个查询结果应该是你想要的。
    具体的原因,你查一下collate相关的资料就可以明白一些了。
      

  9.   


    查询下C的默认collate ,所有的字段排列都是按照collate排列的
      

  10.   

    最后发现没有符合我需求的排序规则(我的实际数据中还有中文等),
    虾哥的提示非常有益处,但是因为时间紧迫,我并没有找到合适的排序规则,
    而是采用了替换字符的办法,目前暂时解决了,
    order by replace (c,'-','0')