在Oracle中,有些时候我们需要在一个json文档中查数据
这个时候我们可以通过JSON_TABLE
函数来把 json文档 提取成一张可以执行正常查询操作的表
先看JSON_TABLE
函数的基础用法:
sql
JSON_TABLE(json_data, '$.json_path' COLUMNS (column_definitions))
其中:
json_data
:要从中提取数据的 JSON文档 或 JSON列
$.json_path
:JSON路径表达式,该表达式指定要提取的数据的位置
COLUMNS子句
:定义要从JSON数据中提取的列,每个列定义都应该包括列名、数据类型和JSON路径表达式,以指定数据在JSON文档中的位置。
例:
sql
SELECT *
FROM JSON_TABLE('{"name": "John", "age": 30, "city": "New York"}',
'$' COLUMNS (name VARCHAR2(50) PATH '$.name_',
age NUMBER PATH '$.age_',
city VARCHAR2(50) PATH '$.city_'));
这里的json_data
='{"name": "John", "age": 30, "city": "New York"}'
$
的含义是从JSON文档的根路径提取数据
COLUMNS子句
表示将从JSON文档中提取name_
、age_
、city_
这三列数据分别放入name
、age
、city
列中
注意()
中的$
表示的路径是基于COLUMNS
前面指定的那个路径,这里是$.$
函数的结果将是一个包含三列的表:name
、age
、city
,其中包含从JSON文档中提取的相应值。
如果JSON文档是一个JSON数组呢?
例如有这样一个json_list文档:
json
[
{
"count": "2",
"items": [
{
"key": "keyOne",
"value": "valueOne"
},
{
"key": "keyTwo",
"value": "valueTwo"
}
]
}
]
虽然里面只有一个JSON对象,但是这个JSON文档是一个JSON数组,用[]
包起来的
看看怎么解析它:
sql
json_table(json_list,
'$[*]' columns (colum_1 VARCHAR2(20) PATH '$.count',
colum_2 VARCHAR2(1000) FORMAT JSON PATH '$.count'));
$[*]
的含义是从JSON数组[]
里面提取数据,*
表示所有元素
COLUMNS子句
表示将从JSON文档中提取count
、count
这两列数据分别放入colum_1
、colum_2
列中
注意columns ()
中的$
表示的路径是基于COLUMNS
前面指定的那个路径,在这里就是$[*].$
函数的结果将是一个包含两列的表:colum_1
、colum_2
路径格式:
- 取所有元素:
$[*]
,表示取所有元素;- 取指定单个元素:如
'$[0]'
,表示取第一个元素;- 取指定多个元素:如
$[0, 2, 4]
,表示取第一、三、五个元素;- 取范围连续元素:如
$[0 TO 2]
,表示取第一到第三个元素;如果不指定元素,如
$[]
,则会报错