oracle in 按顺序展现,oracle的查询结果按照in条件顺序输出

业务需要,通过lucene查出符合搜索条件的id,然后在详情表里查出这些id的详情

SELECT id,QUESTION,QUESTIONCOMMENT FROM "ASKDBA_QUESTION" where ID IN (63,62,65,61,64); 其中id是根据搜索的权值进行的排序,sql没有问题,但是通过这种sql查出来的结果的排序就不对了。

61测试问题101测试问题101

62测试问题102测试问题102

63测试问题103测试问题103

64测试问题104测试问题104

65测试问题106测试问题106

这个一般默认是按照主键来排序的,而并不是根据in中条件的顺序来排列的

网上有个案例是按照in顺序来排序的解决方案,是利用sql server的charindex来解决的。不过仅限于sqlserver

select id,title from info

where id in ('3,1,2,5,4')

order by charindex(','+convert(varchar,ID)+',',',3,1,2,5,4,')

CHARINDEX函数返回字符或者字符串在另一个字符串中的起始位置。CHARINDEX函数调用方法如下: CHARINDEX ( expression1 , expression2 [ , start_location ] ) Expression1是要到expression2中寻找的字符中,start_location是CHARINDEX函数开始在expression2中找expression1的位置。 CHARINDEX函数返回一个整数,返回的整数是要找的字符串在被找的字符串中的位置。假如CHARINDEX没有找到要找的字符串,那么函数整数“0” 这里有小技巧,可以利用charindex来进行模糊匹配

select name,pass from dps_user where

charindex('张三',dps_user.name)> 0

但是oracle下是怎么实现相同的效果的呢?可以使用decode函数

SELECT id,QUESTION,QUESTIONCOMMENT FROM "ASKDBA_QUESTION" where ID IN (63,62,65,61,64) ORDER BY "DECODE"(id, 63,1,62,2,65,3,61,64);

63测试问题103测试问题103

62测试问题102测试问题102

65测试问题106测试问题106

61测试问题101测试问题101

64测试问题104测试问题104 结果是符合条件的

decode函数是oracle很强大的一个函数,

可以参考一下这个文档

mysql里是怎么实现这种需求的呢?

其实很简单orderby filed(col,1,2,3,4...)就行

SELECT * from city where id in (4,2,3,1) ORDER BY field(id,4,2,3,1)

4Mazar-e-SharifAFGBalkh127800

2QandaharAFGQandahar237500

3HeratAFGHerat186800

1KabulAFGKabol1780000

其中filed这个函数的用法如下:

FIELD(str,str1,str2,str3,…) Returns the index (position) of str in the str1, str2, str3, … list. Returns 0 if str is not found. 排序过程:把选出的记录的 id 在 FIELD 列表中进行查找,并返回位置,以位置作为排序依据。 这样的用法,会导致 Using filesort,是效率很低的排序方式。除非数据变化频率很低,或者有长时间的缓存,否则不建议用这样的方式排序。 另外也可以使用substring_index函数或者find_inset函数

总结一下,sql查询一般会按照orderby字段来进行排序,如果没有order by 字段,默认是按照数据存储的顺序来显示的。

所以如果保证按照in顺序的字段来排序输出的话,可以参考以上几种方法,即sqlserver借助charindex,oracle借助decode,mysql借助orderby field。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值