#JSON_VALUE

json_value
JSON_VALUE ( expr FORMAT JSON , json_path RETURNING type )

JSON_VALUE函数将基于json_path所描述的路径对json_value进行检索,并返回对应的标量值。

本函数遵循如下规则:

  • 当expr为NULL或转换JSON类型失败时,函数返回NULL。
  • 函数根据当前路径表达式查询得出的结果包含多个值时,函数返回NULL。
  • 路径表达式末尾指定了json_function_step并且返回多个值时,函数返回NULL。
  • 返回的value为object或array时,函数返回NULL。

expr

expr支持字符串类型、LOB、BFILE、RAW以及JSON类型。在运算之前会先转成JSON类型,转换失败后函数返回NULL。

FORMAT JSON

用于语法兼容,无实际含义,可省略。

json_path

路径表达式,为一个常量字符串,其格式定义请参考json文档中描述。

RETURNING type

RETURNING子句,type为SQL标量类型,目前支持CHAR、VARCHAR、VARCHAR2、NCHAR、NVARCHAR、TINYINT、SMALLINT、INT、BIGINT、NUMBER、FLOAT、DOUBLE以及CLOB类型。

示例(HEAP表)

SELECT JSON_VALUE('{"key4":-0.123,"key5":"test"}','$.key4') res FROM DUAL;
RES
----------------------------------------------------------------
-0.123     

SELECT JSON_VALUE('{"a":{"a":{"a":1}}}', '$."a".a.a') res FROM DUAL;
RES
----------------------------------------------------------------
1 

SELECT JSON_VALUE('{"a":{"a":{"a":1}}}', '$.."a".COUNT()') res FROM DUAL;
RES
----------------------------------------------------------------
3    

--创建用于存储json数据的表table_json
CREATE TABLE IF NOT EXISTS table_json (id INT, c1 VARCHAR(300));
INSERT INTO table_json VALUES(0, '{"key1": 123, "key2": true, "key3": null, "key4": [456, false, null, {"key1": true, "key2": 789, "key3": {"key6": 123}}, [10, false, null]], "key5": {"key1": true, "key2": 789, "key3": null}}');

SELECT JSON_VALUE(c1, '$.key4.key1') res FROM table_json ORDER BY id;
RES
----------------------------------------------------------------
true

SELECT JSON_VALUE(c1, '$.key4[last]') res FROM table_json ORDER BY id;
RES
----------------------------------------------------------------
  

SELECT JSON_VALUE(JSON(c1), '$[0].key4[0][0][0]') res FROM table_json ORDER BY id;
RES
----------------------------------------------------------------
456

SELECT JSON_VALUE('{"data": 123}', '$.data' RETURNING CHAR(3))  v  FROM dual;

V     
----- 
123  

SELECT JSON_VALUE('{"data": 123}', '$.data' RETURNING DOUBLE)  v  FROM dual;

          V 
----------- 
  1.23E+002

SELECT JSON_VALUE('{"data": 123}', '$.data' RETURNING NUMBER)  v  FROM dual;

          V 
----------- 
        123


SELECT JSON_VALUE('{"data": "123.45"}', '$.data' RETURNING INT) v FROM dual;

           V 
------------ 
         123

SELECT JSON_VALUE('{"data": "-99999"}', '$.data' RETURNING INT) v FROM dual;

           V 
------------ 
      -99999


--- 创建带有json列的索引表
CREATE TABLE test(a INT, b JSON);
INSERT INTO test VALUES(1,  '{"key" : 2147483641 }'),
                       (8,  '{"key" : 2147483642 }'),
                       (11, '{"key" : 2147483643 }'),
                       (12, '{"key" : 2147483644 }'),
                       (15, '{"key" : 2147483647 }'),
                       (16, '{"key" : 2147483648 }'),
                       (17, '{"key" : 2147483649 }'),
                       (18, '{"key" : 2147483650 }'),
                       (19, '{"key" : 2147483651 }');

--- 使用json-value创建索引,索引列为bigint类型
CREATE INDEX int_index ON test(JSON_VALUE(b, '$.key' RETURNING BIGINT));

--- 谓词中使用json_value,查询计划选中int_index索引
EXPLAIN SELECT * FROM test WHERE JSON_VALUE(b, '$.key' RETURNING BIGINT) > 2147483644;

PLAN_DESCRIPTION                                                 
---------------------------------------------------------------- 
SQL hash value: 54853043                                        
Optimizer: ADOPT_C                                              
                                                                
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| Id | Operation type                 | Name                 | Owner      | Rows     | Cost(%CPU)  | Partition info                 |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
|  0 | SELECT STATEMENT               |                      |            |          |             |                                |
|  1 |  TABLE ACCESS BY INDEX ROWID   | TEST                 | SYS        |     33000|        6( 0)|                                |
|* 2 |   INDEX RANGE SCAN             | SMALLINT_INDEX       | SYS        |     33000|        4(100)|                                |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
                                                                
Operation Information (identified by operation id):             
---------------------------------------------------             
                                                                
   2 - Predicate : access("TEST"."JSON_VALUE(b, '$.key' RETURNING smallint)" > 2147483644)
pdf-btn 下载文档 copy-btn 复制链接
edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流