CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

各位高手新年好!请教一个排序问题

楼主ybiori()2005-01-01 11:54:15 在 MS-SQL Server / 基础类 提问

表:  
  id                           name  
  1                                 q  
  2                                 r  
  3                                 3  
  4                                 5  
   
  select   id   ,name   from   t   where   id   in   (2,1,4,3)  
   
  现在要求选出来的纪录按id为2,1,4,3的顺序排好,能用sql实现吗?  
  如果   in   (1,4,2,3),就按id   为1,4,2,3的顺序排列  
  问题点数:100、回复次数:22Top

1 楼NinGoo(http://www.NinGoo.net)回复于 2005-01-01 12:02:16 得分 50

 
  select   id,name   from   table1   where   id=2  
  union   all  
  select   id,name   from   table1   where   id=1  
  union   all  
  select   id,name   from   table1   where   id=4  
  union   all  
  select   id,name   from   table1   where   id=3Top

2 楼ybiori()回复于 2005-01-01 12:05:27 得分 0

宁哥的方法以前用过,不过超过256个就不行了,还有别的办法吗?Top

3 楼NinGoo(http://www.NinGoo.net)回复于 2005-01-01 12:11:45 得分 0

那我也没什么好办法了,不过写游标循环将数据按指定的顺序一条条插入到一个临时表是可以的Top

4 楼ybiori()回复于 2005-01-01 12:14:37 得分 0

怎么写阿?游标没怎么用过Top

5 楼ljyjjj(龙睛鱼)回复于 2005-01-01 12:27:24 得分 0

循环将数据按指定的顺序一条条插入到一个临时表吧Top

6 楼ybiori()回复于 2005-01-01 12:31:54 得分 0

是不是这样:  
  先select   id   ,name   from   t   where   id   in   (2,1,4,3)得到结果集:  
   
  id                           name  
  1                                 q  
  2                                 r  
  3                                 3  
  4                                 5  
   
  怎么样才能按2,1,4,3的顺序插到临时表中?Top

7 楼anbangs(大邦)回复于 2005-01-01 12:33:32 得分 0

MarkedTop

8 楼NinGoo(http://www.NinGoo.net)回复于 2005-01-01 12:36:49 得分 0

先建一个辅助表  
  create   table   t1(id   int)  
  里面你需要的顺序插入,比如2,1,4,3  
   
  insert   into   t1  
  select   2  
  union   all   select   1  
  union   all   select   4  
  union   all   select   3  
   
   
   
  declare   @id   int  
  declare   c_test   cursor   for  
  select   id   from   t1                                                 --定义游标  
   
  select   *   into   #tmp   from   table1   where   1=2   --构造临时表的结构  
   
  OPEN   c_test    
   
  FETCH   NEXT   FROM   c_test    
  INTO   @id  
  WHILE   @@FETCH_STATUS   =   0  
  BEGIN  
  insert   into   #tmp   select   id,name   from   table1   where   id=@id       --按t1中的id顺序插数据到临时表  
  FETCH   NEXT   FROM   c_test     INTO   @id  
  End  
  Close   c_test                                        
  deallocate   c_test  
   
  select   *   from   #tmp                                       --从临时表中获得所需要的数据  
   
  Top

9 楼NinGoo(http://www.NinGoo.net)回复于 2005-01-01 12:37:24 得分 0

测试结果  
   
  select   *   from   #tmp  
   
  id                     name    
  -----------   ----    
  2                       r  
  1                       q  
  4                       5  
  3                       3  
   
  (所影响的行数为   4   行)  
   
  Top

10 楼ybiori()回复于 2005-01-01 12:50:16 得分 0

太感谢宁哥了,辅助表t1是不是也应该建成临时表?还有如果是逗号分隔的字符串应该可以用charIndex和subString就可以取得两个逗号之间的值了,这样就不用辅助表和游标了Top

11 楼NinGoo(http://www.NinGoo.net)回复于 2005-01-01 12:51:41 得分 0

当然上面的辅助表也可以不要,那样就要传入一个'2,1,4,3'的字符串,然后分割字符串来比较,我觉得有点麻烦,还不如用辅助表Top

12 楼NinGoo(http://www.NinGoo.net)回复于 2005-01-01 12:54:07 得分 0

而且分割字符串也是需要用循环的,以前的帖子里有人贴过,你找找吧,我一下子还找不到了,呵呵Top

13 楼NinGoo(http://www.NinGoo.net)回复于 2005-01-01 13:00:38 得分 0

如何將下面這樣的一個字符串拆分成獨立的多個字符串  
  http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=2817Top

14 楼x0ne(加勒比海盗)回复于 2005-01-01 13:03:42 得分 0

学习Top

15 楼NinGoo(http://www.NinGoo.net)回复于 2005-01-01 13:05:20 得分 0

好了,确实不需要用游标,给你个完美版,哈哈  
   
   
  select   *   into   #tmp   from   table1   where   1=2   --构造临时表的结构  
   
  declare     @str     varchar(300),@id     varchar(300),@m     int,@n     int      
  set     @str='2,1,4,3,'             ---注意后面有个逗号  
  set     @m=CHARINDEX(',',@str)      
  set     @n=1      
  WHILE     @m>0      
  BEGIN      
                set     @id=substring(@str,@n,@m-@n)      
                print     @id      
                insert   into   #tmp   select   id,name   from   table1   where   id=convert(int,@id)  
                set     @n=@m+1      
                set     @m=CHARINDEX(',',@str,@n)      
  END      
   
  select   *   from   #tmpTop

16 楼631799(杭州工人)回复于 2005-01-01 13:07:18 得分 5

select   id   ,name   from   t   where   id   in   (2,1,4,3)    
  order   by   (case   id   when   2   then   'A'   when   1   then   'B'   when   4   then   'C'   when   3   then   'D'   end)  
   
  select   id   ,name   from   t   where   id   in     (1,4,2,3)  
  order   by   (case   id   when   1   then   'A'   when   4   then   'B'   when   2   then   'C'   when   3   then   'D'   end)Top

17 楼mschen(Co-ok)回复于 2005-01-01 13:13:35 得分 5

--不用什么临时表或者游标,这样写就可以了!  
   
  select   *   from   aaa  
  order   by   case   name   when   'r'   then   1  
                                        when   'q'   then   2  
                                        when   '5'   then   3  
                                        when   '3'   then   4  
                      end  
   
  --测试结果  
  /*  
  id                     name                
  -----------   ----------    
  2                       r  
  1                       q  
  4                       5  
  3                       3  
   
  (所影响的行数为   4   行)  
  */  
  Top

18 楼NinGoo(http://www.NinGoo.net)回复于 2005-01-01 13:18:06 得分 0

楼上的两位方法不错,又偷学了一招,之前还真不知道order   by里也可以用case.  
   
  不过看楼主的意思恐怕有至少超过256条,一条条写也不是办法.还是用字符串分割循环插入临时表的方法有通用性些,呵呵Top

19 楼NinGoo(http://www.NinGoo.net)回复于 2005-01-01 13:24:18 得分 0

我把这个帖子总结到我的blog了,还有新方法的欢迎提出啊,呵呵  
   
  http://blog.csdn.net/ningoo/archive/2005/01/01/236734.aspxTop

20 楼ybiori()回复于 2005-01-01 13:57:43 得分 0

下午去逛街,晚上回来结贴,感谢上面的几位热心朋友们,祝大家2005年好运连连,万事如意哦  
  宁哥辛苦了,还专门找出用charIndex和subString分隔字符串的方法,其实这个小弟自己也会写的,呵呵,再次感谢!我以前没想到一个一个选出来插到临时表里面,老是想怎么能排序,钻牛角尖了  
   
  以后有问题还要请大家指点Top

21 楼vinsonshen(为了明天)回复于 2005-01-01 14:58:23 得分 40

select   *   from   t_test   order   by   case   id   when   2   then   0   when   1   then   1   when   4   then   2   when   3   then   4   endTop

22 楼niqixxx(妮绮)回复于 2005-01-01 16:55:25 得分 0

学习Top

相关问题

  • 请教各位数组排序问题?
  • 排序错误,各位大哥帮忙
  • 各位新年好!
  • HashMap好像不能排序
  • 大家好(新年好):请问在C#中如何如何排序,具体请看内容
  • 排序,排序
  • 各位同仁新年好
  • 一个sql排序问题,请教各位。
  • 排序的问题!!!!各位请进来瞧瞧!
  • 请教各位关于使用SQL语句排序的问题

关键词

  • .net
  • 循环
  • 数据
  • 字符串
  • 临时表
  • 游标
  • 顺序
  • table1where
  • 逗号
  • allselect

得分解答快速导航

  • 帖主:ybiori
  • NinGoo
  • 631799
  • mschen
  • vinsonshen

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo