JSON_TABLE()¶
简介¶
从JSON文档中提取数据,并将其作为具有指定列的关系表返回。
语法¶
JSON_TABLE(expr, path COLUMNS (column_list) [AS] alias)
(1)column_list:column[, column][, ...]
(2)column:name FOR ORDINALITY
|name type PATH string path [on_empty] [on_error]
|name type EXISTS PATH string path
(3)on_empty:
{NULL | DEFAULT json_string | ERROR} ON EMPTY
(4)on_error:
{NULL | DEFAULT json_string | ERROR} ON ERROR
说明¶
1. expr:传入的json数据
2. path:指定json路径,后续构造的数据都要依赖于此路径。
3. name FOR ORDINALITY:名称为name的一个自增列,起始值为1。
4. name type PATH string path [on_empty] [on_error]:从指定的path路径获取数据,转换其类型为type。若获取数据为空,则触发[on empty]子句,若指定路径数据与type不能相互转换,则触发[on error]子句。
5. name type EXISTS PATH string path:若path存在值,则返回1,否则返回0,type通常情况下设为int。
6. on_empty:如果构造列时给定路径PATH上没有发现数据时,该子句取以下值之一:
(1)NULL ON EMPTY:向表中插入NULL,如果没有使用ON EMPTY子句,默认插入NULL。
(2)DEFAULT value ON EMPTY:向表中插入默认值,默认值的类型必须与此列所定义的类型匹配。
(3)ERROR ON EMPTY:抛出一个错误。
7. on_error:当构造列时发生错误,该子句取以下值之一:
(1)NULL ON ERROR:向表中插入NULL,如果没有使用ON ERROR子句,默认返回NULL。
(2)DEFAULT value ON ERROR:向表中插入默认值,默认值的类型必须与此列所定义的类型匹配。
(3)ERROR ON ERROR:抛出一个错误。
8. alias:别名,必须要有一个别名,没有会报错。
示例¶
-- 构造两列数据number和name
SELECT * FROM JSON_TABLE('[{"number":"1","name":"kobe"},{"number":"2","name":"jordan"},{"number":"3","name":"harden"}]','$[*]' columns(number int path '$.number', name varchar(10) path '$.name')) AS T1;
NUMBER(int) |NAME(varchar) |
------------------------------------
1 |kobe |
------------------------------------
2 |jordan |
------------------------------------
3 |harden |
总数目:3
-- 构造一个自增列
SELECT * FROM JSON_TABLE('[{"number":"1","name":"kobe"},{"number":"2","name":"jordan"},{"number":"3","name":"harden"}]','$[*]' columns(rowid FOR ORDINALITY,number int path '$.number', name varchar(10) path '$.name')) AS T1;
ROWID(int) |NUMBER(int) |NAME(varchar) |
----------------------------------------------------
1 |1 |kobe |
----------------------------------------------------
2 |2 |jordan |
----------------------------------------------------
3 |3 |harden |
总数目:3
-- 指定路径下找不到json值,触发on empty
SELECT * FROM JSON_TABLE('[{"name":"kobe"},{"name":"jordan"},{"name":"harden"}]','$[*]' columns(number int path '$.number' NULL on empty, name varchar(10) path '$.name')) AS T1;
NUMBER(int) |NAME(varchar) |
------------------------------------
null |kobe |
------------------------------------
null |jordan |
------------------------------------
null |harden |
总数目:3
SELECT * FROM JSON_TABLE('[{"name":"kobe"},{"name":"jordan"},{"name":"harden"}]','$[*]' columns(number int path '$.number' default '-1' on empty, name varchar(10) path '$.name')) AS T1;
NUMBER(int) |NAME(varchar) |
------------------------------------
-1 |kobe |
------------------------------------
-1 |jordan |
------------------------------------
-1 |harden |
总数目:3
SELECT * FROM JSON_TABLE('[{"name":"kobe"},{"name":"jordan"},{"name":"harden"}]','$[*]' columns(number int path '$.number' error on empty, name varchar(10) path '$.name')) AS T1;
ERROR, Missing value for JSON_TABLE column NUMBER.
-- 指定路径下的json值,与列类型不同,触发on error
SELECT * FROM JSON_TABLE('[{"number":"abc","name":"kobe"},{"number":"2","name":"jordan"},{"number":"def","name":"harden"}]','$[*]' columns(number int path '$.number' NULL on error, name varchar(10) path '$.name')) AS T1;
NUMBER(int) |NAME(varchar) |
------------------------------------
null |kobe |
------------------------------------
2 |jordan |
------------------------------------
null |harden |
总数目:3
SELECT * FROM JSON_TABLE('[{"number":"abc","name":"kobe"},{"number":"2","name":"jordan"},{"number":"def","name":"harden"}]','$[*]' columns(number int path '$.number' default '-1' on error, name varchar(10) path '$.name')) AS T1;
NUMBER(int) |NAME(varchar) |
------------------------------------
-1 |kobe |
------------------------------------
2 |jordan |
------------------------------------
-1 |harden |
总数目:3
SELECT * FROM JSON_TABLE('[{"number":"abc","name":"kobe"},{"number":"2","name":"jordan"},{"number":"def","name":"harden"}]','$[*]' columns(number int path '$.number' error on error, name varchar(10) path '$.name')) AS T1;
ERROR, 错误的数值格式 'abc'
-- EXISTS PATH用例
SELECT * FROM JSON_TABLE('[{"number":"1","name":"kobe"},{"number":"2"},{"number":"3"}]','$[*]' columns(number int path '$.number', name varchar(10) path '$.name',namePath int exists path '$.name')) AS T1;
NUMBER(int) |NAME(varchar) |NAMEPATH(int) |
-------------------------------------------------------
1 |kobe |1 |
-------------------------------------------------------
2 |null |0 |
-------------------------------------------------------
3 |null |0 |
总数目:3