路径表达式
JSON路径表达式作用于JSON树形数据的匹配,它是访问json 树形结构数据的路径,通过表达式的定义,能去匹配并访问到JSON树的某一个或者多个数据节点。
- PATH_EXPR具体语法如下:
{ absolute_path_expr [json_filter_expr] }
路径表达式是有绝对路径表达式和过滤子句表达式组成,过滤子句是可选的,出现在路径的尾部。- ABSOLUTE_PATH_EXPR子句:
{$ json_path_steps}
路径主体是由多个step组成,必须是$符号作为开始符号,$是一个特殊的step,指向原始json数据的根节点。
- JSON_PATH_STEPS子句:
{[.][step] … }
由0个或者多个step组成step list。
- 如果当前step是标量,则为终止step,如果继续写后面不存在的路径,将不会匹配到任何数据。
- 如果当前step是object,则必须是用 ‘.’ 作为分隔符连接。
- 如果当前step是array,则禁止使用‘.’ 作为分隔符连接,需直接写下一个step,而且下一个step的filed_name 必须是空字符串,因为array类型没有key值,例如多维数组的深层访问需写成 A[x][x][x]… 的形式,不能写成A[x].[x].[x]…的形式。
- STEP子句:
step_name[index_list]
每一个step都是由一个step_name和一个index_list组成,对于标量和object类型,index_list也可以不声明,如果声明了且能在list匹配到0下标,则可以匹配到该step。
- STEP_NAME子句:
[* | field_name | empty_str]
- * :代表通配,可以匹配任何字符串。
- field_name :特定的字符串才可以匹配,长度不可以超过68字节,否则会报错,且大小写敏感。
- empty_str:空字符串,该step只能匹配array 类型对象(没有name),例如:多维数组深层访问需写成 A[x][x][x]… 的形式。
- INDEX_LIST子句:
[index_pair][ ,... ]
用[ ]包裹起来的,下标是非减的趋势排列,若出现降序则报错,最多32组下标设置,不能出现空写,形式可以是:
- 单个数字X :取下标X的节点。对于object类型和标量类型,不写下标或者能够匹配到0下标的index_list,均可以访问到该对象节点。
- * :可以访问所有的下标,但是只能单独存在,不能再出现其他index_pair。
- X TO Y 形式 :Y>=X, Y可以不写,则取值是X;X可以不写,则取值是前一个下标对的Y,或者是0。单个数字可以看做为是X to X。
- JSON_FILTER_EXPR子句:
{? ( cond_node )}
和绝对路径是用 ?作为分隔符 ,并且是被()包含,是可选项,置于句子末尾。
- COND_NODE子句:
{{ JSON_COMPARISON } | {COND_NODE && COND_NODE} | {COND_NODE || COND_NODE} | {! COND_NODE} }
目前只支持比较运算,暂不支持逻辑运算(&&和 || 以及 !)。
- JSON_COMPARISON子句:
{ {relative_path_expr compare_pred [json_var | scalar ]} | {[json_var | scalar] compare_pred relative_path_expr } }
比较运算支持上述四种比较类型,相对路径表达式匹配到的必须是标量,不存在算数运算和函数等其他运算。
- RELATIVE_PATH_EXPR子句:
{@ json_path_steps}
相对路径表达式,用于过滤条件子句的相对路径值运算,其父节点是绝对路径中匹配后的每一个节点,在父节点的基础上继续做路径匹配得到某个值进行过滤。和绝对路径表达式相比,它是用@作为开始符号,@代表父节点的根部,也是一个特殊的step,并且目前不支持相对路径表达式后面继续连接JSON_FILTER_EXPR,也就是目前不支持过滤子句的嵌套。
- COMPARE_PRED:
{> | >= | < | <= | == | !=}
比较运算符支持如上。
- JSON_VAR:
{$ identifier_str}
是由$开始,连接一个字符串一起作为变量标志,在json_exists函数中会有passing_clause子句给变量传递值,目前暂未支持。
- SCALAR:
{[json_number | true | false | null | string_value]}
标量的取值是json_number/true/false/null/字符串,其中string_value必须是被双引号“”包裹起来的。
示例:
SQL> select json_query('{"Aaa":{"A":12, "B":13, "c":[14,15,16,17,18]}}', '$.Aaa.c[1 to 3]' with wrapper) as val from SYS_DUMMY; VAL ---------------------------------------------------------------- [15,16,17] 1 rows fetched. SQL> select json_exists('{"Aaa":{"A":12, "B":13, "c":[14,15,16,17,18]}}', '$.Aaa.c[*]?(@ > 18)') as val from SYS_DUMMY; VAL ---------------------------------------------------------------- FALSE 1 rows fetched. SQL> select json_value('{"Aaa":{"A":12, "B":13, "c":[14,15,16,17,18]}}', '$.*[*].A') as val from SYS_DUMMY; VA L---------------------------------------------------------------- 12 1 rows fetched. SQL> select json_query('[23,true]', '$') as val from SYS_DUMMY; VAL ---------------------------------------------------------------- [23,true] 1 rows fetched. SQL> select json_value('[[[24]]]', '$[0][*][to]') as val from SYS_DUMMY; VAL ---------------------------------------------------------------- 24 1 rows fetched. SQL> select json_query('[23,true]', '$[*]?(@ == true) ' with wrapper) as val from SYS_DUMMY; VAL ---------------------------------------------------------------- [true] 1 rows fetched.
SQL> select json_query('{"Aaa":{"A":12, "B":13, "c":[14,15,16,17,18]}}', '$.Aaa.c[*]?(@ > 17)' with wrapper) as val from SYS_DUMMY; VAL ---------------------------------------------------------------- [18] 1 rows fetched.
路径表达式规格:
- 路径表达式最大长度是256字节,最小是1字节;
- 路径表达式最多step层次为32层,最少是1层;
- 路径表达式的INDEX_LIST最多元素对数为32,最少是1;
- 路径表达式step_name最大长度为68,最小是1;
- JSON_FILTER_EXPR目前只支持比较运算;
- JSON_FILTER_EXPR内的路径表达式不允许嵌套出现JSON_FILTER_EXPR;
- JSON_FILTER_EXPR必须出现在绝对路径路径表达式末尾。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」关注作者【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。评论
- COMPARE_PRED:
- RELATIVE_PATH_EXPR子句:
- JSON_COMPARISON子句:
- COND_NODE子句:
- STEP_NAME子句:
- JSON_PATH_STEPS子句:
- ABSOLUTE_PATH_EXPR子句: