sql中,保持In的顺序

 

 

http://topic.csdn.net/u/20080118/17/e9e968a8-c791-461f-b8b2-bfc427925c7a.html

 

发表于:2008-01-18 17:55:21 楼主
如有这样个表:stop
stop_id  stop_name
  1      aaaaa
  2      bbbbb
  3      ccccc
  4      ddddd
  5      eeeee
  6      fffff    stop_id是主键
然后执行SQL语句:select stop_name from stop where stop_id in(3,4,1,5) 输出的结果是aaaaa ccccc ddddd eeeee
是按照数据库中的物理顺序输出的,但我想要的是按(3,4,1,5)的顺序,即结果是ccccc ddddd aaaaa eeeee
应该怎么样写SQL语句呀?大家帮帮我,谢谢了!
 
 
30  修改 删除 举报 引用 回复

进入用户个人空间
加为好友
发送私信
在线聊天
  • W3031213101
  • 等级:
  • 可用分等级:
  • 总技术专家分:
  • 总技术专家分排名:
发表于:2008-01-18 17:59:451楼 得分:0
有点过分了....,呵呵,你一条一来吧...
 
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • zhuanshen712
  • 等级:
  • 可用分等级:
  • 总技术专家分:
  • 总技术专家分排名:
发表于:2008-01-18 17:59:542楼 得分:0
in只会去看记录在不在里面,不会去管in里面的顺序,所以说,换个想法吧,你在in里面写好顺序也没用。
最好是把需求说一说。
 
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • jaywll
  • 等级:
  • 可用分等级:
  • 总技术专家分:
  • 总技术专家分排名:
发表于:2008-01-18 19:22:103楼 得分:0
其实我做的是个公交查询的系统,有三个表:所有站点的集合stop: stop_id stop_name 
所有线路ID和它包含的站点的ID对应表:line_id stop_id (stop_id都是按始发站到终点站排列好的)
所有线路的集合line: line_id line_name
要实现的功能就是把选中的线路所包含的站点按始发站到终点站的顺序显示出来
我写的SQL语句:Select stop_name from stop where stop_id in(select stop_id from linestops where line_id in(select line_id from line where line_name=‘被选中的线路名称'))
但输出结果的顺序都是数据库中的物理顺序,不能按想要的顺序排列,望大家指教!
 
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • fcuandy
  • 等级:
  • 可用分等级:
  • 总技术专家分:
  • 总技术专家分排名:
发表于:2008-01-18 19:38:554楼 得分:15
SQL code
           
           
SELECT * FROM tb WHERE id IN ( 3 , 4 , 1 , 5 ) ORDER BY CHARINDEX ( ' , ' + RTRIM (id) + ' , ' , ' , ' + ' 3,4,1,5 ' + ' , ' )
 
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • ysgan
  • 等级:
  • 可用分等级:
  • 总技术专家分:
  • 总技术专家分排名:
发表于:2008-01-18 20:29:055楼 得分:0
关注
 
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • only_endure
  • 等级:
  • 可用分等级:
  • 总技术专家分:
  • 总技术专家分排名:
发表于:2008-01-18 21:02:576楼 得分:15
CharIndex:http://www.itlearner.com/article/2005/2442.shtml
 
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • jaywll
  • 等级:
  • 可用分等级:
  • 总技术专家分:
  • 总技术专家分排名:
发表于:2008-01-18 21:06:437楼 得分:0
fcunandy
你的那个方法不知道把'3,4,1,5'换成了SQL语句还能不能用,因为我实际中没有中间数值的都是SQL语句,我尝试了下一直有语法错误,不知道怎么搞呀。
 
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • only_endure
  • 等级:
  • 可用分等级:
  • 总技术专家分:
  • 总技术专家分排名:
发表于:2008-01-18 21:08:518楼 得分:0
4楼的能解释解释么?谢谢~
 
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • only_endure
  • 等级:
  • 可用分等级:
  • 总技术专家分:
  • 总技术专家分排名:
发表于:2008-01-18 21:11:029楼 得分:0
SQL code
           
           
SELECT * FROM tb WHERE id IN ( 3 , 4 , 1 , 5 ) ORDER BY CHARINDEX ( ' , ' , + RTRIM (id) + ' , ' , ' , ' + ' 3,4,1,5 ' + ' , ' )

少个逗号.
 
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • fcuandy
  • 等级:
  • 可用分等级:
  • 总技术专家分:
  • 总技术专家分排名:
发表于:2008-01-18 21:18:1110楼 得分:0
你的子查询,还是用的in, 也即,子查询中选出的3,4,1,5都不是按你意想中的顺序的.
in操作符, sql处理时,若匹配即取出, 不会按in中的顺序处理的.

 
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • only_endure
  • 等级:
  • 可用分等级:
  • 总技术专家分:
  • 总技术专家分排名:
发表于:2008-01-18 21:19:0311楼 得分:0
给你举个例子:
--查询效果如下:
select * from ai
go
id          no       
----------- ----------
105        2
105        1
103        1
105        4


i.
--要求的查询结果如下
--即要求no列的数据按'4','1','2'排列
id          no       
----------- ----------
105        4
105        1
103        1
105        2


--解决方案1
--利用函数CHARINDEX
select * from ai
order by charindex(no,'4,1,2')

--解决方案2
--利用函数case
select * from ai
order by case when no='4' then 1
        when no='1' then 2
                      when no='2' then 3
                end

--解决方案3
--利用UNION 运算符
select * from ai
where no='4'
union all
select * from ai
where no='1'
union all
select * from ai
where no='2'

ii.
--查询要求指定no='4'排第一行,其他的行随机排序
id          no       
----------- ----------
105        4
105        2
105        1
103        1

--解决方案
select * from ai
order by case when no='4' then 1
  else 1+rand()
  end

iii.
--查询要求所有行随机排序

--解决方案
select * from ai
order by newid()


iiii
--有一表ab有列i,其中数据如下:
i varchar(10)
a1
a10
a101
a5
p4
p41
p5


--现在要求列i中数据先按字母排序,再按数字排序
--效果如下:
a1
a5
a10
a101
p4
p5
p41

--解决方案
select * from ab
order by left(i,1),convert(int,substring(i,2,8000))
 
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • fcuandy
  • 等级:
  • 可用分等级:
  • 总技术专家分:
  • 总技术专家分排名:
发表于:2008-01-18 21:25:3912楼 得分:0
ORDER BY CHARINDEX(','+RTRIM(id)+','  ,  ',3,1,5,4,')

前后辍加 , 只是为了避免误匹配.当然,如果id的位数及 后面的字串中每个元素的位数都只一位的话,是没有问题的.

比如
charindex(rtrim(id),'31,22,44,211')
当某行记录 id=11, 时,就会被 211误匹配.
当前后加,时,就会以 ,11, 与各项匹配,那么就不会误匹配.

设记录中有
11
21
22
31
44
55

执行时,第一行, CHARINDEX(','+RTRIM(id)+','  ,  ',31,22,44,211,') 得到的 charindex结果是 0
第二行是 0,
第三行是 5
第四行是 2
第五行是 8
第6行是0
由 in 过滤了记录,选取了
22 (row 3)
31 (row 4)
44  (row 5)
而由 charindex的结果来排序得到了:
2,5,8
即 第四行,第三行,第五行.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值