阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Oracle 11g学习笔记–model子句

389次阅读
没有评论

共计 3162 个字符,预计需要花费 8 分钟才能阅读完成。

Oracle 11g 学习笔记–model 子句

oracle 10g 中新增的 model 子句可以用来进行行间计算。model 子句允许像访问数组中元素那样访问记录中的某个列,这就提供了诸如电子表格计算之类的计算能力;

先来看一个简单的例子:

select 
    prd_type_id, year, month, sales_amount
    from all_sales
    where prd_type_id between 1 and 2 and emp_id = 21
    model
        partition by (prd_type_id)
        dimension by (month, year)
        measures (amount sales_amount) (sales_amount[1, 2004] = sales_amount[1, 2003],
            sales_amount[2, 2004] = sales_amount[2, 2003] + sales_amount[3, 2003],
            sales_amount[3, 2004] = round(sales_amount[3, 2003] * 1.25, 2)
            )
order by prd_type_id, year, month;

partition by(prd_type_id)指定结果是根据 prd_type_id 分区的,所谓的分区就是在 prd_type_id 不等的情况下,一下的定义数组是互相不能访问的;

dimension by(month, year) 定义数组的维数是 month, year, 这就意味着必须提供月份和年份才能访问数组中的单元;

measures(amount sales_amount)表明数组中的每个单元包含一个数量,同时表明数组名为 sales_amount. 为了访问 sales_amount 数组中标示 2003 年 1 月的那个单元,可以使用 sales_amount[1, 2003],返回指定年月的销量。

执行结果:
Oracle 11g 学习笔记–model 子句

图中的所有 2004 年的数据就是通过 model 生成出来的;

补充:对于数组的访问方式,还可以显示的访问,如 sales_amount[1, 2003]可以显示指定维度 sales_amount[month = 1, year = 2003],但是这种方式明显更复杂。必须提一下的是两者的区别:他们处理维度中空值得方式是不同的,例如 sales_amount[null, 2003]返回月份为空值,年份为 2003 的销量,而 sales_amount[month = null, year = 2003]则不会返回任何有效数据,因为 null=null 的返回值总是 false;

对于数组角标的维度还可以通过以下扩展方法:
1.between 和 and :

-- 将 2004 年 1 月的销量设置为 2003 年 1 月至 3 月的销量的平均值取整;
sales_amount[1, 2004] = round(sum(sales_amount)[month between 1 and 3, 2003], 2);

2.any 和 isany

-- 表示将 2004 年 1 月的销量设置为所有年份月份的销量值和取整
sales_amount[1, 2004] = round(sum(sales_amount)[any, year is any], 2);

3.currentv()
该函数用于获的某个维度的当前值。

-- 表示将 2004 年第一个月的销量设置为 2003 年同月销量的 1.25 倍。注意此处用 currentv()获取当前月份,其值为1sales_amount [1, 2004] = round(sales_amount[currentv(), 2003] *1.25, 2)

4.for 循环
该表达式将 2004 年前三个月的销量设置为 2003 年相应月份销量的 1.25 倍。其中 increment 1 表示了变量每次循环 +1

sales_amount[for month from 1 to 3 increment 1, 2004] = round (sales_amount[currentv(), 2003] * 1.252

5. 处理空值和缺失值
■使用 is present
当数据单元指定的单位在 model 子句执行之前存在,则 is precent 返回 ture.

sales_amount[for month from 1 to 3 increment 1, 2004] = 
case when sales_amount[currentv(), 2003] is present 
    then
        round (sales_amount[currentv(), 2003] * 1.25, 2) 
    else 
        0 
    end

■presentv()
如果 cell 引用的记录在 model 子句执行之前就存在,那么 presentv(cell, expr1, expr2)返回表达式 expr1。如果这条记录不存在,则返回表达式 expr2。

sales_amount[for month from 1 to 3 increment 1, 2004] = presentv(sales_amount[currentv(), 2003], 
round(sales_amount[currentv(), 2003] * 1.252), 0)

■presentnnv
presentnnv(cell, expr1, expr2)如果 cell 引用的单元在 model 子句执行之前已经存在,并且该单元的值不为空,则返回表达式 expr1。如果记录不存在,或单元值为空,则返回表达式 expr2;

sales_amount[for month from 1 to 3 increment 1, 2004] = presentnnv(sales_amount[currentv(), 2003], 
round(sales_amount[currentv(), 2003] * 1.252), 0)

■ignore nav 和 keep nav
此关键词使用在 model 后面;

ignore nav 返回值如下:
●空值或缺失数字值时返回 0
●空值或缺失字符串值时返回空值字符串
●空值或缺失日期值时返回 01-jan-2000。
●其它所有数据库类型时返回空值

keep nav 对空值或缺失数字值返回空值, 默认条件;

select .....
from table 
model ignore nav
paratition by ....
dimension by ....
measures .......

更新已有的单元

默认情况下,如果表达式左端的引用单元存在,则更新该单元。如果该单元不存在,就在数组中创建一条新的记录。可以用 rules update 改变这种默认行为,支出在单元不存在的情况下不创建新纪录;

为了验证效果,我们引用本文开头的代码:

select 
    prd_type_id, year, month, sales_amount
    from all_sales
    where prd_type_id between 1 and 2 and emp_id = 21
    model
        partition by (prd_type_id)
        dimension by (month, year)
        measures (amount sales_amount) 
    rules update (sales_amount[1, 2004] = sales_amount[1, 2003],
            sales_amount[2, 2004] = sales_amount[2, 2003] + sales_amount[3, 2003],
            sales_amount[3, 2004] = round(sales_amount[3, 2003] * 1.25, 2)
            )
order by prd_type_id, year, month;

Oracle 11g 学习笔记–model 子句

引用从图中可以看出已经没有 2004 年的数据了;

更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-10/136114.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计3162字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7807155
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
CSDN,你是老太太喝粥——无齿下流!

CSDN,你是老太太喝粥——无齿下流!

CSDN,你是老太太喝粥——无齿下流! 大家好,我是星哥,今天才思枯竭,不写技术文章了!来吐槽一下 CSDN。...
优雅、强大、轻量开源的多服务器监控神器

优雅、强大、轻量开源的多服务器监控神器

优雅、强大、轻量开源的多服务器监控神器 在多台服务器同时运行的环境中,性能监控、状态告警、资源可视化 是运维人...
2025年11月28日-Cloudflare史诗级事故:一次配置失误,引爆全球宕机

2025年11月28日-Cloudflare史诗级事故:一次配置失误,引爆全球宕机

2025 年 11 月 28 日 -Cloudflare 史诗级事故: 一次配置失误,引爆全球宕机 前言 继今...
【1024程序员】我劝你赶紧去免费领一个AWS、华为云等的主机

【1024程序员】我劝你赶紧去免费领一个AWS、华为云等的主机

【1024 程序员】我劝你赶紧去免费领一个 AWS、华为云等的主机 每年 10 月 24 日,程序员们都会迎来...
星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛 NAS-11:咪咕视频订阅部署全攻略 前言 在家庭影音系统里,NAS 不仅是存储中心,更是内容...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定! 前言 作为 NAS 玩家,你是否总被这些...
三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

  三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Andr...
如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的 Nano Banana Pro?附赠邪修的用法 前言 大家好,我是星哥,今天来介绍谷歌的 ...
颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

  颠覆 AI 开发效率!开源工具一站式管控 30+ 大模型 ApiKey,秘钥付费 + 负载均衡全...
星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

  星哥带你玩飞牛 NAS-16:不再错过公众号更新,飞牛 NAS 搭建 RSS 对于经常关注多个微...