oracle的查询结果按照in条件顺序输出
业务需要,通过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条件顺序输出的更多相关文章
- ORACLE中查询语句的执行顺及where部分条件执行顺序测试
Oracle中的一些查询语句及其执行顺序 原文地址:https://www.cnblogs.com/likeju/p/5039115.html 查询条件: 1)LIKE:模糊查询,需要借助两个通配符, ...
- 优化 : Oracle数据库Where条件执行顺序 及Where子句的条件顺序对性能的影响
.Oracle数据库Where条件执行顺序: 由于SQL优化起来比较复杂,并且还会受环境限制,在开发过程中,写SQL必须必须要遵循以下几点的原则: 1.ORACLE采用自下而上的顺序解析WHERE子句 ...
- Oracle Where查询语句与排序语句
SQL限制和排序数据 1.Oracle的Where条件值,字符串和日期都必须以单引号括起来. 模糊查询: like 'S%' 以S开头的任意字符 like 'S_' 以S开头的任意字符结尾的两个字符 ...
- oracle高级查询(实例基于scott用户四张表)
oracle高级查询(实例基于scott用户四张表) 分组查询 多表查询 子查询 综合实例 ====================================================== ...
- oracle分页查询及原理分析(总结)
oracle分页查询及原理分析(总结) oracle分页查询是开发总为常用的语句之一,一般情况下公司框架会提供只需套用,对于增删改查而言,查是其中最为关键也是最为难的一块,其中就有使用率最高的分页查询 ...
- oracle 分页查询数据重复问题
最近在做项目的时候发现一个问题,oracle 在查询分页数据的时候,有几条数据重复查询了,并且有几条数据在分页的时候消失了.百度了一下发现,ORACLE 在查询数据的时候返回的行不是固定的,他只是按照 ...
- 五、Oracle 分组查询、视图
一.分组函数1.avg:平均分2.sum:求和3.max:最大值4.min:最小值注意:前面四个必须针对数值字段,且参数只能是一个5.count:求个数 二.分组查询1.语法是 group by 分组 ...
- oracle提高查询效率的34条方法
注:本文来源:远方的守望者 <oracle提高查询效率的34条方法> oracle提高查询效率的34条方法 1.选择最有效率的表名顺序 (只在基于规则的优化器中有效): ORACLE的解 ...
- oracle提高查询效率的34个方面全解析
oracle提高查询效率的34个方面全解析 在一个数据库中进行操作的时候,效率是很重要的,那么,如何提高oracle的查询效率呢?笔者将从以下几个方面进行详细解析: 1.选择最有效率的表名顺序(只 ...
随机推荐
- linux 基础命令总结
1.mkdir 创建目录 -p 创建多级目录 mkdir -p /data/test -m, --mode=模式 设置权限模式(类似chmod),而不是rwxrwxrwx 减umask -p, --p ...
- AGC013 E Placing Squares——模型转化+矩阵乘法
题目:https://atcoder.jp/contests/agc013/tasks/agc013_e 边长的平方,可以看做是在该范围内放两个不同的球的方案数.两个球可以重合. 题意变成:给长为 n ...
- 使用mysql应该注意的细节
一.表及字段的命名规范 1.可读性原则 使用大写和小写来格式化的库对象名字以获得良好的可读性. 例如:使用CustAdress而不是custaddress来提高可读性.(这里注意有些DBMS系统对表名 ...
- 图解HTTP 读书笔记
1 了解Web及网络基础 1.1 HTTP/1.0 HTTP正式作为标准被公布实在1996年五月,版本命名为HTTP/1.0,记载于RFC1945.至今仍广泛使用在服务器端. RFC1945 – ...
- apr not found,APR-util not found,pcre,
1.下载所需软件包(此下载链接经由作者验证可使用): wget http://archive.apache.org/dist/apr/apr-1.4.5.tar.gz wget http://arch ...
- vue-router 传递参数的几种方式
本文转载自:https://blog.csdn.net/crazywoniu/article/details/80942642 vue-router传递参数分为两大类 编程式的导航 router.pu ...
- Series序列
import pandas as pd '''Series序列:1.序列 的声明,指定index列标签2.查看列索引(index)和元素 (values)3.选择内部元素4.为元素赋值5.用Numpy ...
- Python多进程、多线程和协程简介
一.进程和线程 进程是一个执行中的程序.每个进程都拥有自己的地址空间.内存.数据栈以及其他用于跟踪执行的辅助数据.在单核CPU系统中的多进程,内存中可以有许多程序,但在给定一个时刻只有一个程序在运行: ...
- List<Map>去重并合并数量
今天在查询出的sql中,出现了部门名称和部门ID有重合的数据!当然这样在页面上展示也会容易一起误导!查询出的数据结构如下图 希望根据deptid中 >最后一个节点id把deptname 合并成& ...
- 修改默认runlevel
CentOS直接修改文件 /etc/inittab 就好了 # Default runlevel. The runlevels used are: # - halt (Do NOT set init ...