oracle 高级用法
场景 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 提出的需求详细如下,一个简朴的例子 ?6,更多关于开窗函数的用法请参考? 这个 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |