查看: 434|回復: 3

[每日一題] PL/SQL Challenge 每日一題:2020-6-2 JSON_VALUE(12.2)

[復制鏈接]
論壇徽章:
527
奧運會紀念徽章:壘球
日期:2008-09-15 01:28:12生肖徽章2007版:雞
日期:2008-11-17 23:40:58生肖徽章2007版:馬
日期:2008-11-18 05:09:48數據庫板塊每日發貼之星
日期:2008-11-29 01:01:02數據庫板塊每日發貼之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春紀念徽章
日期:2009-01-04 14:52:28數據庫板塊每日發貼之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食紀念
日期:2009-07-22 09:30:00
跳轉到指定樓層
1#
發表于 2020-6-21 03:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最先答對且答案未經編輯的puber將獲得紀念章一枚(答案不可編輯但可發新貼補充或糾正),其他會員如果提供有價值的分析、討論也可獲得紀念章一枚。

每兩周的優勝者可獲得itpub獎勵的技術圖書一本。

以往舊題索引:
http://www.3490925.live/forum.php?m ... eid&typeid=1808

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

作者:Kim Berg Hansen

運行環境:SQLPLUS, SERVEROUTPUT已打開, 最低版本要求:12.2
注:本題給出答案時候要求給予簡要說明才能得到獎品

我有一張表,以JSON格式保存著多次測試的結果:

create table qz_tests (
   id    integer primary key
, data  varchar2(4000) check(data is json)
);

insert into qz_tests values ( 1,
'{
   test: "Number 1"
, millisecs: [71, 42, 40, 43]
}');

insert into qz_tests values ( 2,
'{
   test: "Number 2"
, millisecs: [155, 78]
}');

insert into qz_tests values ( 3,
'{
   test: "Number 3"
, millisecs: [18]
}');

commit;

JSON數組millisecs含有該測試的每次運行的結果。我想要看每次測試中第二次運行的結果(因為第一次運行往往不可靠),如果沒有第二次運行,我想要顯示"N/A"。

為此我寫了這個未完成的查詢:

select
   t.id
, ##REPLACE##
      as second_run
from qz_tests t
order by t.id;

哪些選項含有一個列別名為SECOND_RUN的表達式,可以用來取代 ##REPLACE## ,使得查詢執行不出錯并且產生這個所需的輸出:

        ID SECOND_RUN
---------- ----------
         1 42
         2 78
         3 N/A
(A)
  t.data.millisecs[1]

(B)
   nvl(t.data.millisecs[1], 'N/A')

(C)
   json_value(t.data, '$.millisecs[1]')

(D)
   json_value(
      t.data, '$.millisecs[1]'
      default 'N/A' on empty
   )

(E)
   json_value(
      t.data, '$.millisecs[1]'
      default 'N/A' on error
   )

(F)
   json_value(
      t.data, '$.millisecs[1]'
      default '###' on error
      default 'N/A' on empty
   )

論壇徽章:
535
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:馬
日期:2008-10-08 17:01:01SQL大賽參與紀念
日期:2011-04-13 12:08:17授權會員
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉絲徽章
日期:2011-07-01 09:45:27ITPUB十周年紀念徽章
日期:2011-09-27 16:30:472012新春紀念徽章
日期:2012-01-04 11:51:22海藍寶石
日期:2012-02-20 19:24:27鐵扇公主
日期:2012-02-21 15:03:13
2#
發表于 2020-6-22 09:25 | 只看該作者
答案:BDEF
A: json中數組元素是從0開始的,1對應第二個,但最后一個測試結果只有一個值,沒有對應元素結果返回NULL
B: 利用NVL函數對沒有對應元素結果返回NULL轉成了N/A
C: json_value沒有對應元素結果返回NULL,結果與A同
D: json_value利用on empty子句對結果返回NULL轉成了N/A
E: json_value默認的錯誤處理行為是 null on error, 即錯誤發生不拋出,而是返回NULL,如果要拋出就 error on error.
   default為NULL指定了默認值
F: json_value 的第二個變量可以指定子句  RETURNING, ON ERROR, and ON EMPTY,這里后兩個同時指定了

使用道具 舉報

回復
論壇徽章:
16
山治
日期:2017-01-11 16:13:26技術圖書徽章
日期:2017-08-23 14:17:00技術圖書徽章
日期:2017-08-23 14:17:00秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05
3#
發表于 2020-6-22 09:31 | 只看該作者
答案  BDEF

A) 錯誤,沒有第二次運行結果的,輸出的是null而非題目要求的 'N/A'

B) 正確,通過nvl函數,修復了A的問題

C) 錯誤,沒有第二次運行結果的,輸出的是null而非題目要求的 'N/A'

D) 正確,default 'N/A' on empty語句,修復了C的問題

E) 正確,default 'N/A' on error 語句,因為沒有第二次運行記錄,所以出發了errror,修復了C的問題

F)正確,default '###' on error  default 'N/A' on empty  ,兩個default語句,我認為優先級的問題,on empty的優先級高于on error,所以會輸出  'N/A'

使用道具 舉報

回復
論壇徽章:
527
奧運會紀念徽章:壘球
日期:2008-09-15 01:28:12生肖徽章2007版:雞
日期:2008-11-17 23:40:58生肖徽章2007版:馬
日期:2008-11-18 05:09:48數據庫板塊每日發貼之星
日期:2008-11-29 01:01:02數據庫板塊每日發貼之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春紀念徽章
日期:2009-01-04 14:52:28數據庫板塊每日發貼之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食紀念
日期:2009-07-22 09:30:00
4#
 樓主| 發表于 2020-6-23 03:41 | 只看該作者
答案BDEF, 2樓得獎。

A:
我們得到了有第二次運行的兩個測試的正確輸出,但我們沒有得到第三個測試的N/A。相反,我們在這個錯誤的輸出中得到了一個NULL。

        ID SECOND_RUN
---------- ----------
         1 42
         2 78
         3
            
B:
使用NVL可以解決前一選項的問題。

C:
使用JSON_VALUE而不是圓點表示法,結果和A選項一樣,所以這也會得到同樣錯誤的輸出。

D:
但我們可以使用JSON_VALUE中的一個內置解決方案來代替NVL,當JSON元素為空時,顯示一個默認值。

E:
JSON_VALUE支持兩個子句: ON EMPTY表示在空元素上應該發生什么,ON ERROR表示在出錯時應該發生什么(比如類型轉換之類的錯誤)。如果我們不使用ON EMPTY,那么它默認和ON ERROR一樣,所以這個選項對這些數據是有效的(此處并沒有發生錯誤)

F:
前面的選擇會在ON ERROR和ON EMPTY中都給出N/A。在這個選項中,我們明確地在兩者之間做了區別,但由于我們沒有導致錯誤的數據,所以我們數據的輸出是相同和正確的。

使用道具 舉報

回復

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則 發表回復

DTCC2020中國數據庫技術大會 限時8.5折

【架構革新 高效可控】2020年9月21日~23日第十一屆中國數據庫技術大會將在北京隆重召開。

大會設置2大主會場,20+技術專場,將邀請超百位行業專家,重點圍繞數據架構、AI與大數據、傳統企業數據庫實踐和國產開源數據庫等內容展開分享和探討,為廣大數據領域從業人士提供一場年度盛會和交流平臺。

http://dtcc.it168.com


大會官網>>
30岁的男人干啥赚钱快赚钱多 白小姐一码开奖结果 股票涨跌秘笈 青海快三计划 甘肃快3实时计划 网上赚钱的兼职项目 中国最大的股票配资平台 排列七怎样算中奖 泛亚电子竞技英雄时时乐 昨晚香港6合开什么码 在线打麻将游戏
TOP技術積分榜 社區積分榜 徽章 團隊 統計 知識索引樹 積分競拍 文本模式 幫助
  ITPUB首頁 | ITPUB論壇 | 數據庫技術 | 企業信息化 | 開發技術 | 微軟技術 | 軟件工程與項目管理 | IBM技術園地 | 行業縱向討論 | IT招聘 | IT文檔
  ChinaUnix | ChinaUnix博客 | ChinaUnix論壇
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓優訊信息技術有限公司版權所有 聯系我們 
京ICP備09055130號-4  北京市公安局海淀分局網監中心備案編號:11010802021510 廣播電視節目制作經營許可證:編號(京)字第1149號
  
快速回復 返回頂部 返回列表
白小姐一码开奖结果 股票涨跌秘笈 青海快三计划 甘肃快3实时计划 网上赚钱的兼职项目 中国最大的股票配资平台 排列七怎样算中奖 泛亚电子竞技英雄时时乐 昨晚香港6合开什么码 在线打麻将游戏