你的位置:首页 > 数据库

[数据库]还来一篇说下json_value 以及 json_query 的应用


上一篇说了一下openjson 的一些使用方法,这次再说一下在2016里面的查询取值,当然就是 json_query 和 json_value 这2兄弟了

首先

declare @json varchar(100) = '{"a":"[6,4]","b":[7,4],"c":"hi"}'select json_query(@json,'$.a'),json_value(@json,'$.a')NULL                     [6,4]select json_query(@json,'$.b'),json_value(@json,'$.b')[7,4]                     NULLselect json_query(@json,'$.b[1]'),json_value(@json,'$.b[1]')NULL                       4select json_query(@json,'$.c'),json_value(@json,'$.c')NULL                   hi

可以看到,对于json_value 来说,如果说取到的属性并不能直接解析成int,string,bool 这3种类型(那就是说 array 类型和 Object 类型是返回空的),
而json_query 则刚刚相反,对于能解析成int,string,bool 的项,它直接返回Null值,对于 array 和object 则把对应的元素返回。这2个的区别是要搞清楚的。

PS:对于这个json来说,它是解析时才会去检测语法的。不像

declare @json varchar(100) = '{"a":"[6,4]",d:[7,4],"c":"hi"}'select isjson(@json)select json_query(@json,'$.a'),json_value(@json,'$.a')select json_query(@json,'$.c'),json_value(@json,'$.c')


首先使用 isjson() 函数判断@json 变量是否一个标准json 格式,很明显不是,因为 d 的位置缺少了双引号。所以返回0

那正常来说既然这样的话下面2个jsonquery 应该都报错或者都返回 Null 才对。

然而 查询a 的值的时候,是可以返回的,因为还没有到分析错误的位置。所以 查询a 的值的语句是有效的。返回 [6,4]

但是查询c 的时候,因为需要经过d的位置,报错来,所以无法进行下去。所以语句就报语法错误。就是这个道理。

 

如果说得不对,欢迎大家继续拍砖