JSON 系列之5:JSON_QUERY

上一篇文章介绍了JSON_VALUE,他接受一个JSON输入,输出一个SQL数据类型的标量。

JSON_QUERY也是接受一个JSON输入,但输出的仍是JSON数据类型。

还是通过示例来学习吧。

创建测试表,插入2条数据:

sql 复制代码
drop table customerTab;

CREATE TABLE
customerTab (custData VARCHAR2(4000),
CONSTRAINT ensure_json2 CHECK (custData IS
JSON STRICT));

CREATE TABLE
customerTab (custData JSON);

INSERT INTO
customerTab
VALUES ('{
"custNo":2,
"name" : "Jane",
"status":"Gold",
"address": {
"Street": "Main Rd 1",
"City": "San Jose",
"zip": 95002
}}');

INSERT INTO
customerTab
VALUES ('{
"custNo":3,
"name" : "Jill",
"status":["Important","Gold"],
"address": {
"Street": "Broadway 2",
"City": "Belmont",
"zip": 94065
}}');

commit;

查询地址,返回的是JSON对象:

sql 复制代码
SQL> 
SELECT
JSON_QUERY(custData, '$.address')
FROM
customerTab;

JSON_QUERY(CUSTDATA,'$.ADDRESS')                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
---------------------------------------------------------------------------------
{"Street":"Main Rd 1","City":"San Jose","zip":95002}
{"Street":"Broadway 2","City":"Belmont","zip":94065}

查询状态,返回的第2列是数组,但第一列不是:

sql 复制代码
SQL>
SELECT
JSON_QUERY(custData, '$.status')
FROM customerTab;

JSON_QUERY(CUSTDATA,'$.STATUS')                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
-----------------------------------------------------------------------
"Gold"
["Important","Gold"]

如果希望都返回数组,可以使用ARRAY WRAPPER子句:

sql 复制代码
SQL>
SELECT
JSON_QUERY(custData, '$.status' WITH ARRAY WRAPPER)
FROM customerTab;

JSON_QUERY(CUSTDATA,'$.STATUS'WITHARRAYWRAPPER)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
-------------------------------------------------------------------
["Gold"]
[["Important","Gold"]]

SQL>
SELECT
JSON_QUERY(custData, '$.status' WITH CONDITIONAL ARRAY WRAPPER)
FROM customerTab;

JSON_QUERY(CUSTDATA,'$.STATUS'WITHCONDITIONALARRAYWRAPPER)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
--------------------------------------------------------------------
"Gold"
["Important","Gold"]

再插入一条带多个地址的数据:

sql 复制代码
INSERT INTO
customerTab
VALUES ('{
"custNo":3,
"name" : "Jim",
"status": "Silver",
"address":[
{
"Street": "Fastlane 4",
"City": "Atherton",
"zip": 94027
},
{
"Street": "Slowlane 5",
"City": "San Francisco",
"zip": 94105
} ]
}');

commit;

查询地址,可以看出有无ARRAY WRAPPER的区别:

sql 复制代码
SQL>
SELECT
JSON_QUERY(custData, '$.address[*].City' )
FROM customerTab;

JSON_QUERY(CUSTDATA,'$.ADDRESS[*].CITY')                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
-----------------------------------------------
"San Jose"
"Belmont"


已选择 3 行。

SQL>
SELECT
JSON_QUERY(custData, '$.address[*].City' WITH ARRAY WRAPPER)
FROM customerTab;

JSON_QUERY(CUSTDATA,'$.ADDRESS[*].CITY'WITHARRAYWRAPPER)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
-------------------------------------------------------------------
["San Jose"]
["Belmont"]
["Atherton","San Francisco"]

已选择 3 行。

实际上*可以省略,下面SQL等同于上面的SQL:

sql 复制代码
SELECT
JSON_QUERY(custData, '$.address.City' WITH ARRAY WRAPPER)
FROM customerTab;

*表示所有,也可以指定范围:

sql 复制代码
SELECT
JSON_QUERY(custData, '$.address[0 to 1].City' WITH ARRAY WRAPPER)
FROM customerTab;

接下来看官网上的例子

sql 复制代码
-- 注意,输入是Lax Syntax,输出则是Strict JSON Syntax
SELECT JSON_QUERY('{a:100, b:200, c:300}', '$') AS value
  FROM DUAL;

VALUE
---------------------------------------------------------------------------
{"a":100,"b":200,"c":300}

SELECT JSON_QUERY('{a:100, b:200, c:300}', '$.a' WITH WRAPPER) AS value
  FROM DUAL;

VALUE
----------------------------------------------------------------------------
[100]

SELECT JSON_QUERY('{a:100, b:200, c:300}', '$.*' WITH WRAPPER) AS value
  FROM DUAL;

VALUE
----------------------------------------------------------------------------
[100,200,300]

SELECT JSON_QUERY('[0,1,2,3,4]', '$') AS value
  FROM DUAL;

VALUE
----------------------------------------------------------------------------
[0,1,2,3,4]

SELECT JSON_QUERY('[0,1,2,3,4]', '$' WITH WRAPPER) AS value
  FROM DUAL;

VALUE
----------------------------------------------------------------------------
[[0,1,2,3,4]]

SELECT JSON_QUERY('[0,1,2,3,4]', '$[*]' WITH WRAPPER) AS value
  FROM DUAL;

VALUE
-----------------------------------------------------------------------------
[0,1,2,3,4]

SELECT JSON_QUERY('[0,1,2,3,4,5,6,7,8]', '$[0, 3 to 5, 7]' WITH WRAPPER) AS value
  FROM DUAL;

VALUE
--------------------------------------------------------------------------------
[0,3,4,5,7]

SELECT JSON_QUERY('[{a:100},{b:200},{c:300}]', '$[0]'
       WITH CONDITIONAL WRAPPER) AS value
  FROM DUAL;

VALUE
--------------------------------------------------------------------------------
{"a":100}

-- 若无WITH CONDITIONAL WRAPPER,则返回null
SELECT JSON_QUERY('[{"a":100},{"b":200},{"c":300}]', '$[*]'
       WITH CONDITIONAL WRAPPER) AS value
  FROM DUAL;

VALUE
----------------------------------------------------------------------------
[{"a":100},{"b":200},{"c":300}]

-- 和上例类似,只是返回的是SQL数据类型,而非JSON
SELECT JSON_QUERY('[{"a":100},{"b":200},{"c":300}]', '$[*]'
       RETURNING VARCHAR2(100) WITH CONDITIONAL WRAPPER) AS value
  FROM DUAL;

VALUE
----------------------------------------------------------------------------
[{"a":100},{"b":200},{"c":300}]

-- EMPTY ON ERROR 为默认,其实可以不写。可以改为ERROR ON ERROR试试
SELECT JSON_QUERY('[{"a":100},{"b":200},{"c":300}]', '$[3]'
       EMPTY ON ERROR) AS value
  FROM DUAL;

VALUE
--------------------------------------------------------------------------------
[]

参考

相关推荐
AI、少年郎1 小时前
Oracle 进阶语法实战:从多维分析到数据清洗的深度应用(第四课)
数据库·oracle
专注VB编程开发20年4 小时前
C#,VB.NET从JSON数据里提取数组中的对象节点值
c#·json·.net
cpsvps8 小时前
触发器设计美国VPS:优化数据库性能的关键策略
数据库·oracle
草履虫建模9 小时前
Postman - API 调试与开发工具 - 标准使用流程
java·测试工具·spring·json·测试用例·postman·集成学习
我科绝伦(Huanhuan Zhou)10 天前
Oracle|Oracle SQL*Plus 配置上下翻页功能
数据库·sql·oracle
奔跑的蜗牛AZ10 天前
TiDB 字符串行转列与 JSON 数据查询优化知识笔记
笔记·json·tidb
曹牧10 天前
Oracle获取前100条记录
数据库·oracle
Lightning_201710 天前
Neo4j.5.X社区版创建数据库和切换数据库
数据库·oracle·neo4j
远方160910 天前
72-Oralce Temporay tablespace(单实例和多租户下的管理)
大数据·数据库·sql·oracle·database
多多*10 天前
计算机网络期末 网络基础概述
运维·服务器·网络·数据库·计算机网络·oracle·lua