上一篇说了一下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] NULL select json_query(@json,‘$.b[1]‘),json_value(@json,‘$.b[1]‘) NULL 4 select 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来说,它是解析时才会去检测语法的。不像xml先检查整个xml有没有错,然后再解析,改造一下上面的样例,就是这个样子
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的位置,报错来,所以无法进行下去。所以语句就报语法错误。就是这个道理。
如果说得不对,欢迎大家继续拍砖
时间: 2024-10-05 22:32:23