各位高手新年好!请教一个排序问题
表:
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




