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