JSON_VALUE()¶
简介¶
返回指定路径中的JSON值,且可根据RETURNING type指定返回值的类型
语法¶
JSON_VALUE(json_doc, path [RETURNING type] [on_empty] [on_error])
(1)on_empty:
{NULL | ERROR | DEFAULT value} ON EMPTY
(2)on_error:
{NULL | ERROR | DEFAULT value} ON ERROR
说明¶
json_doc:
传入的json数据
path:
指定json路径
on_empty:如果JSON_VALUE()在给定路径上没有发现数据时,该子句取以下值之一:
(1)NULL ON EMPTY:JSON_VALUE()返回NULL,如果没有使用ON EMPTY子句,默认返回NULL。
(2)DEFAULT value ON EMPTY:返回提供的默认值,默认值的类型必须与返回类型匹配。
(3)ERROR ON EMPTY:抛出一个错误。
on_error:当JSON_VALUE()发生错误时,该子句取以下值之一:
(1)NULL ON ERROR:JSON_VALUE()返回NULL,如果没有使用ON ERROR子句,默认返回NULL。
(2)DEFAULT value ON ERROR:返回提供的默认值,默认值的类型必须与返回类型匹配。
(3)ERROR ON ERROR:抛出一个错误。
当以下事件发生时会触发ON ERROR:
转换错误,例如,指定路径下的值类型为CHAR,而返回值类型是INT4。
RETURNING type:
目前神通数据库支持的返回值类型包括:FLOAT4,FLOAT8,NUMERIC,INT4,DATE,TIME,JSON,CHAR,VARCHAR,SIGNED,UNSIGNED。
注解
SIGNED和UNSIGNED是为了兼容mysql数据库而新增的类型,这两种类型的使用方法与INT4相同,但这两种类型只能作为json_value的返回值类型,不能在建表,PL语句或其它函数中使用。
返回值类型需满足以下条件:
(1)若没有触发on_error子句或者on_empty子句,则返回值类型必须与指定路径下的数据的类型可以相互转换。
(2)若触发了on_error子句或者on_empty子句,则返回值类型必须与默认值类型可以相互转换。
注解
on_empty,on_empty和指定路径下的数据,其数据格式符合返回值类型,即可被返回。
例如:
(1)on_empty的默认值为'1999-01-02',返回值类型为DATE,CHAR(20),VARCHAR(20)时,都可以将其返回。
(2)on_empty的默认值为'100',返回值类型为FLOAT4,FLOAT8,NUMERIC,INT4,SIGNED,UNSIGNED时,都可以将其返回。
JSON_VALUE()会检查所有JSON输入(文档和路径)的有效性。 如果其中任何一个是无效的,或者on_empty默认值,on_error默认值与返回值类型不同,则抛出一个SQL错误,而不会触发ON ERROR子句。
示例¶
SELECT JSON_VALUE('{"item": "shoes", "price": "49.95"}', '$.price');
JSON_VALUE(text) |
----------------------
49.95 |
总数目:1
-- 指定路径下找不到json值,触发on empty
SELECT JSON_VALUE('{"item": "shoes", "price": "49.95"}', '$.p' NULL on empty);
JSON_VALUE(text) |
----------------------
null |
总数目:1
SELECT JSON_VALUE('{"item": "shoes", "price": "49.95"}', '$.p' default 'abc' on empty);
JSON_VALUE(text) |
----------------------
abc |
总数目:1
SELECT JSON_VALUE('{"item": "shoes", "price": "49.95"}', '$.p' error on empty);
ERROR, 函数参数非法, No value was found by 'json_value' on the specified path.
-- 指定路径下的json值,与返回值类型不同,触发on error
SELECT JSON_VALUE('{"item": "shoes", "price": "abcd"}', '$.price' returning int4 NULL on error) as a;
A(int) |
------------
null |
总数目:1
SELECT JSON_VALUE('{"item": "shoes", "price": "abcd"}', '$.price' returning int4 default '10' on error) as a;
A(int) |
------------
10 |
总数目:1
SELECT JSON_VALUE('{"item": "shoes", "price": "abcd"}', '$.price' returning int4 default error on error) as a;
ERROR, parser: syntax error at or near "error" at character 134
-- on empty和on error的默认值类型与返回值类型不同时,会报错
SELECT JSON_VALUE('{"item": "shoes", "price": "49.95"}', '$.p' returning int4 default 'abc' on empty);
ERROR, 错误的数值格式 'abc'
SELECT JSON_VALUE('{"item": "shoes", "price": "abcd"}', '$.price' returning int4 default 'abc' on error) as a;
ERROR, 错误的数值格式 'abc'
-- 同时使用on empty和on error
SELECT JSON_VALUE('{"item": "shoes", "price": "abc"}', '$.price' returning signed default '2' on empty default '4' on error) as a;
A(int) |
------------
4 |
总数目:1