zoukankan      html  css  js  c++  java
  • 还来一篇说下json_value 以及 json_query 的应用 (3)

    上一篇说了一下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的位置,报错来,所以无法进行下去。所以语句就报语法错误。就是这个道理。

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

  • 相关阅读:
    html 滚动条
    mybatis的select、insert、update、delete语句
    eclipse 删除工作空间中.metadata 再加入以前的maven项目编译出错解决方法
    JavaDailyReports10_18
    JavaDailyReports10_17
    JavaDailyReports10_16
    JavaDailyReports10_15
    JavaDailyReports10_14
    JavaDailyReports10_13
    JavaDailyReports10_12
  • 原文地址:https://www.cnblogs.com/Gin-23333/p/5411736.html
Copyright © 2011-2022 走看看