ITPUB论坛-中国最专业的IT技术社区

 手机号登录  找回密码
 注册
查看: 3893|回复: 1

[每日一题] PL/SQL Challenge 每日一题:2018-1-11 JSON_VALUE(12.2新功能)

[复制链接]
论坛徽章:
496
目光如炬
日期:2015-11-22 22:00:00秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21探花
日期:2016-01-06 14:11:18进士
日期:2016-01-06 14:11:18
发表于 2018-1-16 04:23 | 显示全部楼层 |阅读模式
最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

每两周的优胜者可获得itpub奖励的技术图书一本。

以往旧题索引:
http://www.itpub.net/forum.php?m ... eid&typeid=1808

原始出处:
http://www.plsqlchallenge.com/

作者: Kim Berg Hansen

运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品

我们的角色扮演游戏在一个JSON列中存储着玩家的角色描述:

create table qz_players (
   id       integer primary key
, name     varchar2(10)
, profile  varchar2(4000) check (profile is json)
)
/

insert into qz_players values (11, 'Admarq', '{
   type : "Paladin"
, alignment : "Lawful good"
}')
/
insert into qz_players values (12, 'Briannie', '{
   type : "Druid"
, alignment : ""
}')
/
insert into qz_players values (13, 'Celecus', '{
   type : "Wizard"
, alignment : "Chaotic neutral"
}')
/
insert into qz_players values (14, 'Drumble', '{
   type : "Cleric"
, weaponsproficiency: "Battle axe"
}')
/
commit
/

我想要一个清单,包含id, name 和 alignment。

如果alignment在JSON中不存在,那么显示文本"{not available}" (不带引号)
如果alignment在JSON中存在,但是一个空串,那么显示文本"{unknown}" (不带引号)

为此我写了这个未完成的查询:

select id
     , name
     , ##REPLACE##
          as alignment
  from qz_players
order by id
/

哪些选项包含了一个列别名为ALIGNMENT的表达式,可以用来取代 ##REPLACE## 使得查询返回这个输出:

        ID NAME       ALIGNMENT
---------- ---------- --------------------
        11 Admarq     Lawful good
        12 Briannie   {unknown}
        13 Celecus    Chaotic neutral
        14 Drumble    {not available}

(A)
json_value(profile, '$.alignment')

(B)
NVL(
          json_value(
             profile, '$.alignment'
             default '{not available}' ON EMPTY
          )
        , '{unknown}'
       )

(C)
NVL(
          json_value(
             profile, '$.alignment'
             default '{not available}' ON ERROR
          )
        , '{unknown}'
       )

(D)
NVL(
          json_value(
             profile, '$.alignment'
             default '{unknown}' ON ERROR
          )
        , '{not available}'
       )

(E)
json_value(
          profile, '$.alignment'
          default '{unknown}' ON ERROR
          default '{not available}' ON EMPTY
       )


(F)
       json_value(
          profile, '$.alignment'
          default '{not available}' ON EMPTY
          default '{unknown}' ON NULL
       )

论坛徽章:
496
目光如炬
日期:2015-11-22 22:00:00秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21探花
日期:2016-01-06 14:11:18进士
日期:2016-01-06 14:11:18
 楼主| 发表于 2018-1-17 05:52 | 显示全部楼层
答案BC,本期无人参与。

A: 这个选项根本就没有处理两种特殊情况,所以Briannie 和 Drumble的alignment在输出中都会显示为空:

        ID NAME       ALIGNMENT
---------- ---------- --------------------
        11 Admarq     Lawful good
        12 Briannie
        13 Celecus    Chaotic neutral
        14 Drumble              

B: 我们可以用ON EMPTY来指定一个缺省值,用于JSON_VALUE找不到任何东西的情况。这就处理了把Drumble显示为{not available}的情况,于是JSON_VALUE仅为Briannie返回NULL, 然后我们就可以用古老又好用的NVL来变成 {unknown}。

C: ON EMPTY 是12.2的新特性——12.1时我们得用ON ERROR。对这个特殊情况我们会得到相同的结果,在其他情况下也许需要区分"empty"错误和其他错误,于是12.2有了ON EMPTY的增强功能。

D: 但是此处我们调换了逻辑。Briannie的空字符串应该被显示为{unknown},这不是错误——但是对Dumble不存在的alignment键值却是个错误。所以我们得到这个“相反”的错误输出:

        ID NAME       ALIGNMENT
---------- ---------- --------------------
        11 Admarq     Lawful good
        12 Briannie   {not available}
        13 Celecus    Chaotic neutral
        14 Drumble    {unknown}

E: 如果我们同时指定了ON EMPTY 和 ON ERROR, 那么 ON EMPTY的缺省值被用于“找不到匹配”,而ON ERROR的缺省值被用于其他错误。在我们的例子中,Dumble只有ON EMPTY型的错误,Briannie的情况不是错误,我们只是取回了空串。于是我们得到这个错误输出:
        ID NAME       ALIGNMENT
---------- ---------- --------------------
        11 Admarq     Lawful good
        12 Briannie
        13 Celecus    Chaotic neutral
        14 Drumble    {not available}

F: JSON_VALUE没有ON NULL子句,所以编译出错:
ORA-40450: invalid ON ERROR clause.

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表