日期:2014-05-19  浏览次数:20416 次

case when问题
gold是等级       expire_date是到期时间      
       
根据前面的查询是按等级后再按到期时间,这样的话高等级的过期的人就在低等级没过期的人的前面.      
       
现在要做成       过期的都要到后面显示       无论等级是多少       而没过期的还是正常按等级及到期时间排列      

Create       Table       #TEST      
    (ID       Int,      
        gold   Int,      
        expire_date   DateTime)      
    Insert       #TEST       Select       1,2, '2006-06-30 '      
    Union       All       Select       2,3, '2006-06-30 '      
    Union       All       Select       3,5, '2006-05-30 '      
    Union       All       Select       4,6, '2006-06-12 '      
    Union       All       Select       5,10, '2006-07-30 '      
    Union       All       Select       6,1, '2006-08-30 '      
    Union       All       Select       6,1, '2008-08-30 '    
    Union       All       Select       6,1, '2009-08-30 '    

select       top       100       *       from       [#TEST]       order       by       (Case       When       expire_date> =GetDate()       Then     0       Else     1     End),       gold       desc,expire_date       desc      

Case       When       expire_date> =GetDate()       Then     0       Else     1     End这个表达式是什么意思,是不是当expire_date> =GetDate()时上面语句就是order   by   0,gold   desc,expire   desc要不就是order   by   1,gold   desc,expire   desc

------解决方案--------------------
等于这句
select top 100 *,
(Case When expire_date> =GetDate() Then 0 Else 1 End) AS 是否过期
from [#TEST]
order by 是否过期, gold desc, expire_date desc