http://topic.csdn.net/u/20080118/17/e9e968a8-c791-461f-b8b2-bfc427925c7a.html
加为好友
发送私信
在线聊天
fcuandy 等级: 可用分等级:中农 总技术专家分:50164 总技术专家分排名:162
发表于:2008-01-18 19:38:55 4 楼 得分:15
SQL code
SELECT
*
FROM
tb
WHERE
id
IN
(
3
,
4
,
1
,
5
)
ORDER
BY
CHARINDEX
(
'
,
'
+
RTRIM
(id)
+
'
,
'
,
'
,
'
+
'
3,4,1,5
'
+
'
,
'
)
修改 删除 举报 引用 回复
加为好友
发送私信
在线聊天
发表于:2008-01-18 21:11:02 9 楼 得分:0
SQL code
SELECT
*
FROM
tb
WHERE
id
IN
(
3
,
4
,
1
,
5
)
ORDER
BY
CHARINDEX
(
'
,
'
,
+
RTRIM
(id)
+
'
,
'
,
'
,
'
+
'
3,4,1,5
'
+
'
,
'
)
少个逗号.
修改 删除 举报 引用 回复
加为好友
发送私信
在线聊天
发表于:2008-01-18 21:19:03 11 楼 得分: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 等级: 可用分等级:中农 总技术专家分:50164 总技术专家分排名:162
发表于:2008-01-18 21:25:39 12 楼 得分: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 即 第四行,第三行,第五行.