原始出处:
http://www.plsqlchallenge.com/
作者:Darryl Hurley
运行环境:SQLPLUS, SERVEROUTPUT已打开
我执行了如下SQL:
CREATE TABLE plch_json
( always_json CLOB,
CONSTRAINT keep_it_real
CHECK ( always_json IS JSON ) );
INSERT INTO plch_json
VALUES(
'{
"plch_id" : "1",
"plch_desc" : "One",
"plch_detail" : {
"detail1" : "1",
"detail2" : "2",
"detail3" : [5,4,3,2,1]
},
}'
);
COMMIT;
哪些选项会返回 1 ?
(A)
SELECT JSON_VALUE(p.always_json,'$.plch_detail.detail1')
FROM plch_json p;
(B)
SELECT JSON_VALUE(p.always_json,'$.plch_detail.detail3[4]')
FROM plch_json p;
(C)
SELECT JSON_VALUE(p.always_json,'$.plch_detail.detail3[0]')
FROM plch_json p;
(D)
SELECT JSON_VALUE(p.always_json,'$.plch_detail.detail3[5]')
FROM plch_json p;
(E)
SELECT JSON_VALUE(p.always_json,'$.plch_detail.detail3[5]'
DEFAULT '1' ON ERROR )
FROM plch_json p;
(F)
SELECT JSON_VALUE(p.always_json,'$.plch_detail.detail3[5]'
ERROR ON ERROR )
http://www.plsqlchallenge.com/
作者:Darryl Hurley
运行环境:SQLPLUS, SERVEROUTPUT已打开
我执行了如下SQL:
CREATE TABLE plch_json
( always_json CLOB,
CONSTRAINT keep_it_real
CHECK ( always_json IS JSON ) );
INSERT INTO plch_json
VALUES(
'{
"plch_id" : "1",
"plch_desc" : "One",
"plch_detail" : {
"detail1" : "1",
"detail2" : "2",
"detail3" : [5,4,3,2,1]
},
}'
);
COMMIT;
哪些选项会返回 1 ?
(A)
SELECT JSON_VALUE(p.always_json,'$.plch_detail.detail1')
FROM plch_json p;
(B)
SELECT JSON_VALUE(p.always_json,'$.plch_detail.detail3[4]')
FROM plch_json p;
(C)
SELECT JSON_VALUE(p.always_json,'$.plch_detail.detail3[0]')
FROM plch_json p;
(D)
SELECT JSON_VALUE(p.always_json,'$.plch_detail.detail3[5]')
FROM plch_json p;
(E)
SELECT JSON_VALUE(p.always_json,'$.plch_detail.detail3[5]'
DEFAULT '1' ON ERROR )
FROM plch_json p;
(F)
SELECT JSON_VALUE(p.always_json,'$.plch_detail.detail3[5]'
ERROR ON ERROR )
FROM plch_json p;
A: 这个查询从plch_detail.detail1元素找出了值1。
B: 这个查询从detail3数组找出了值1。元素从0开始计数,所以它找到了数组中的第五个元素。
C: 这个查询返回5, 这是中detail3数组的第一个位置(即0)得到的。
D: 这个查询返回NULL, 因为detail3数组的位置5没有元素。请记住计数器是从0开始算的。
E: 这个查询找不到位置5的元素,因为它不存在(数组元素计数器是从0开始算的)。于是DEFAULT ON ERROR子句就把“找不到元素”的错误转换为1。注意缺省的 ON ERROR 行为是返回NULL, 如选项D所示。
F: 这个查询找不到位置5的元素,因为它不存在(数组元素计数器是从0开始算的)。于是ERROR ON ERROR子句对“找不到元素”的错误进行了处理,并且转换为这个Oracle错误:
ORA-40462: JSON_VALUE evaluated to no value
注意,缺省的 ON ERROR 行为是返回NULL, 如选项D所示。