加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 百科 > 正文

oracle 高级用法

发布时间:2021-01-24 08:47:47 所属栏目:百科 来源:网络整理
导读:场景 01 (IN 语句 排序 decode() 函数): 1,我们在查询中会经常使用这样的用法, select * from table_name t where t.id in (1,3,7,9),这是一条查询表中 id 为 1, 3, 7, 9 的数据现在我们加上一个需求, 要求查出来的数据的顺序和 括号内 id 的 顺

场景 01 (IN 语句 排序 decode() 函数):

1,我们在查询中会经常使用这样的用法, select * from table_name t where t.id in (1,3,7,9),这是一条查询表中 id 为 1, 3, 7, 9 的数据现在我们加上一个需求,

要求查出来的数据的顺序和 括号内 id 的 顺序一致,有人会说直接 order by t.id 啊,多简单,那假设顺序是乱的呢?又假如 id 不是数字,而是字符串呢?

如??select * from table_name t where t.id in (1,13,9)? 或者?select * from table_name t where t.id in (‘hjkhjk’,‘sfhjsf‘,‘sdasda‘,‘dasdad‘)?

2,这时候排序就会很麻烦,oracle 数据库为我们提供了一个强大的函数 decode,具体用法如下:

select * from table_name t where t.id in (1,9) order by decode (t.id,1,2,9,4)?

其中 decode 函数的结果作为 order by 的内容,括号内的参数为 (排序字段,值,顺序,值,顺序……),其中,顺序值越小,排序越靠前

场景 02 (分组排序查询,开窗函数 OVER (PARTITION BY COL1 ORDER BY COL2)?):

1,平时做项目的时候,我们会经常遇到这种情况,假设一张表,每一天都会给表中的每一个种类添加一条数据,现在我们要求根据某个日期查询出所有种类的对应数据,

这很简单,如? select * from table_name t where t.date = ‘20190101‘

2,接下来我们增加难度,要求如果该种类当前查询的日期不存在数据,那么取 最近的前一个有数据的日期 下的对应数据,通俗点说就是 我们要查 20190101 这个日期

下各种类的数据,但是 A 种类 该日期没数据,那么就把日期提前,比如 20181231,如果还没有,就查 20191230,直到找到有数据的日期为止

3,这时候有人会说,我们可以先查出每个种类下 小于等于查询日期 有数据的最大日期,在查询数据,这种方式可行,但是如果表中有几千几万个种类,这回对性能造成

很大的压力

4,这时我们会想到 我们要是能把数据 根据种类分组,然后按 时间倒序 取每个分组的第一条,不就 OK 了吗? 这是我们就要用到 oracle 为我们提供的强大分析函数,也

叫开窗函数?OVER(PARTITION BY X??ORDER BY Y DESC) 该函数一般好结合?ROW_NUMBER() 这个获取序号的函数一起结合起来,作为 select 的 查询字段使用,

如:select row_number() over(partition by x order by y desc) rn ……? ?(这种方式获取的 rn 就是排序之后的序号)

5,其中?PARTITION BY X 是根据 X 字段分组,ORDER BY Y DESC 根据 Y 排序,??ROW_NUMBER() 在分组排序完成之后,为每个分组中的数据逐条添加序号,每个分

组之间互不干扰,都是从 1 开始往后排,这是后我们直接取行号为 1 的数据,就完美的完成了 2 提出的需求具体如下,一个简单的例子

oracle 高级用法

?6,更多关于开窗函数的用法请参考? 这个

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读