业务需要,通过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。

oracle的查询结果按照in条件顺序输出的更多相关文章

  1. ORACLE中查询语句的执行顺及where部分条件执行顺序测试

    Oracle中的一些查询语句及其执行顺序 原文地址:https://www.cnblogs.com/likeju/p/5039115.html 查询条件: 1)LIKE:模糊查询,需要借助两个通配符, ...

  2. 优化 : Oracle数据库Where条件执行顺序 及Where子句的条件顺序对性能的影响

    .Oracle数据库Where条件执行顺序: 由于SQL优化起来比较复杂,并且还会受环境限制,在开发过程中,写SQL必须必须要遵循以下几点的原则: 1.ORACLE采用自下而上的顺序解析WHERE子句 ...

  3. Oracle Where查询语句与排序语句

    SQL限制和排序数据 1.Oracle的Where条件值,字符串和日期都必须以单引号括起来. 模糊查询: like 'S%' 以S开头的任意字符 like 'S_' 以S开头的任意字符结尾的两个字符 ...

  4. oracle高级查询(实例基于scott用户四张表)

    oracle高级查询(实例基于scott用户四张表) 分组查询 多表查询 子查询 综合实例 ====================================================== ...

  5. oracle分页查询及原理分析(总结)

    oracle分页查询及原理分析(总结) oracle分页查询是开发总为常用的语句之一,一般情况下公司框架会提供只需套用,对于增删改查而言,查是其中最为关键也是最为难的一块,其中就有使用率最高的分页查询 ...

  6. oracle 分页查询数据重复问题

    最近在做项目的时候发现一个问题,oracle 在查询分页数据的时候,有几条数据重复查询了,并且有几条数据在分页的时候消失了.百度了一下发现,ORACLE 在查询数据的时候返回的行不是固定的,他只是按照 ...

  7. 五、Oracle 分组查询、视图

    一.分组函数1.avg:平均分2.sum:求和3.max:最大值4.min:最小值注意:前面四个必须针对数值字段,且参数只能是一个5.count:求个数 二.分组查询1.语法是 group by 分组 ...

  8. oracle提高查询效率的34条方法

    注:本文来源:远方的守望者  <oracle提高查询效率的34条方法> oracle提高查询效率的34条方法 1.选择最有效率的表名顺序 (只在基于规则的优化器中有效): ORACLE的解 ...

  9. oracle提高查询效率的34个方面全解析

    oracle提高查询效率的34个方面全解析   在一个数据库中进行操作的时候,效率是很重要的,那么,如何提高oracle的查询效率呢?笔者将从以下几个方面进行详细解析: 1.选择最有效率的表名顺序(只 ...

随机推荐

  1. springmvc对象作为 目标方法的参数。

    /** * Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配, 自动为该对象填充属性值.支持级联属性. * 如:dept.deptId.dept.address.tel 等 */ ...

  2. 浅谈js for循环输出i为同一值的问题(闭包解决)

    1.最近开发中遇到一个问题,为什么每次输出都是5,而不是点击每个p,就alert出对应的1,2,3,4,5. <html> <head> <meta http-equiv ...

  3. java 标准输入输出流,打印流,数据流

    1 package stream; import static org.junit.Assert.assertNotNull; import java.io.BufferedReader; impor ...

  4. 【Linux】设置开机自启

    忘记转发的哪里的. 方法 1这种方法会利用 /etc/ 中的 rc.local 文件来在启动时执行脚本与命令.我们在文件中加上一行来执行脚本,这样每次启动系统时,都会执行该脚本. 不过我们首先需要为 ...

  5. iptables防火墙相关命令详解

    前提基础: 当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发. iptables实现防火墙功能 ...

  6. SPOJ - FTOUR2 (点分治+树状数组)

    题目:https://vjudge.net/contest/307753#problem/I 题意:有一颗树,上面有白色黑色点,每个点上有一个权值,权值可以为负,现在我要求一条路径,权值和最大,这条路 ...

  7. 创建Spring Boot 工程

    先在eclipse中安装spring -tool -suite插件,然后根据以下步骤可以创建   1.新建Spring Starter Project 2.Packaging 选择 jar 3.勾选W ...

  8. python/pandas 正则表达式 re模块

    目录 正则解说 中文字符集 re模块常用方法 1.正则解说 数量词的贪婪模式与非贪婪模式 正则表达式通常用于在文本中查找匹配的字符串.Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪) ...

  9. 测开之路五十五:实现类似于unittest查找case

    实现给一个路径,去查找test开头的测试用例文件 创建一个计算器的类,方便后面测试用 class Calculator(object): def add(self, x, y): return x + ...

  10. SQL语句:随机取3条不重复的记录

    随机取3条不重复的记录 [Access]select top 3 * from tablename order by rnd(id); [SqlServer]select top 3 * from t ...