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

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

其中id是根据搜索的权值进行的排序,sql没有问题,但是通过这种sql查出来的结果的排序就不对了。

1
2
3
4
5
<b>61   测试问题101 测试问题101
62  测试问题102 测试问题102
63  测试问题103 测试问题103
64  测试问题104 测试问题104
65  测试问题106 测试问题106 </b>

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

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

1
2
3
<b>select id,title from info  
where id in ('3,1,2,5,4')  
order by charindex(','+convert(varchar,ID)+',',',3,1,2,5,4,') </b>

http://www.sosuo8.com/article/show.asp?id=2958

CHARINDEX函数返回字符或者字符串在另一个字符串中的起始位置。CHARINDEX函数调用方法如下: CHARINDEX ( expression1 , expression2 [ , start_location ] ) Expression1是要到expression2中寻找的字符中,start_location是CHARINDEX函数开始在expression2中找expression1的位置。 CHARINDEX函数返回一个整数,返回的整数是要找的字符串在被找的字符串中的位置。假如CHARINDEX没有找到要找的字符串,那么函数整数“0”

这里有小技巧,可以利用charindex来进行模糊匹配

1
2
select name,pass from dps_user where
charindex('张三',dps_user.name)> 0

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

1
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);
1
2
3
4
5
63  测试问题103 测试问题103
62  测试问题102 测试问题102
65  测试问题106 测试问题106
61  测试问题101 测试问题101
64  测试问题104 测试问题104

结果是符合条件的

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

可以参考一下这个文档

http://www.cnblogs.com/ZHF/archive/2008/09/12/1289619.html

http://database.ctocio.com.cn/tips/489/6064989.shtml

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

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

1
SELECT  * from city where id in (4,2,3,1) ORDER BY field(id,4,2,3,1)
1
2
3
4
4   Mazar-e-Sharif  AFG Balkh   127800
2   Qandahar    AFG Qandahar    237500
3   Herat   AFG Herat   186800
1   Kabul   AFG Kabol   1780000

其中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函数

http://kidcraze.org/mysql-in-%E6%8E%92%E5%BA%8F%E9%97%AE%E9%A2%98/

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

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

最新文章

  1. 配置react native遇到的问题
  2. codeforces gym 100286 H - Hell on the Markets (贪心算法)
  3. PowerDesigner逆向工程从现有数据库生成PDM
  4. 【1-4】jQuery代码风格-导航栏
  5. HTTP与HttpServlet
  6. 一个WebForm中连接SQL Server的例子
  7. Spread 之自定义对角线cellType源码: DiagonalCellType
  8. SDC(3)&ndash;set_multicycle_path 最关键的一张图
  9. 在Activity之间如何传递数据,请尽可能说出你所知道的传递数据的方法,并详细描述其实现过程。
  10. Java读取图像和网络存储
  11. 关于new,delete,malloc,free的一些总结
  12. 【翻译】为Ext JS和Sencha Touch开发人员准备的应用程序监测(App Inspector)
  13. 在Fabric ChainCode中导入第三方包(以状态机为例)
  14. MySQL——修改数据库远程权限
  15. expect 安装 salt 客户端
  16. IdentityServer4服务器配置
  17. python入门(六):函数
  18. loadrunner&#160;场景设计-集合点设置
  19. 15-算法训练 P1103
  20. 一台机子同时启动两个相同版本的tomcat

热门文章

  1. 进程管理工具uptime,top,htop
  2. 安装uWebSocketIO
  3. python的os.path.join()
  4. 将windows下的文件上传到Linux服务器上
  5. 在线清空nohup.out内容
  6. spring boot 尚桂谷学习笔记10 数据访问02 mybatis
  7. Vim使用taglist功能
  8. rafy使用笔记
  9. Git SSH连接方式配置
  10. mysqldump 多实例备份