你的位置:首页 > 数据库

[数据库]继续说一下2016里面的json功能(1)


首先先来测试数据,数据是使用之前的,就

不要在意这些细节了啊~

借用上一篇的测试数据create table t1(ID int identity,name nvarchar(50),Chinese int ,Math int)insert into t1 values ('张三',90,80),('李四',75,90),('王五',68,100),('赵六',90,null);

 

然后我们使用这个表里面生成的json 来进行测试,最简单的例子

declare @v nvarchar(600) = N'[{"ID":1,"name":"张三","Chinese":90,"Math":80},{"ID":2,"name":"李四","Chinese":75,"Math":90},{"ID":3,"name":"王五","Chinese":68,"Math":100},{"ID":4,"name":"赵六","Chinese":100}]'select * from openjson(@v)with (ID int '$.ID',name nvarchar(50) '$.name',Math int '$.Math',Chinese int '$.Chinese')------------------------ID     name                        Math    Chinese----------- -------------------------------------------------- ----------- -----------1      张三                         80     902      李四                         90     753      王五                         100     684      赵六                         NULL    100


就是最简答的将Json 解析成结果集的形式,如果节点不存在那么赋值则为空

其实也就跟open

 

然后用法2 ,可以解析出json 格式里面的格式,当openjson 后面没有加关键字with 的时候,则认为是解析出json本身的结构。比方说(因为使用格式化成文本在这个语句下面有点奇怪,所以就用结果集贴上来,有点乱,大家将就着)

declare @v nvarchar(600) = N'{"ID":1,"name":"张三","Chinese":90,"Math":80}'select * from openjson(@v)key  value     typeID      1  2name    张三  1Chinese  90  2Math  80  2

 

前面2个都好理解,第三个位置,type 。类型,在openjson 的解析里面是这样

0  null

1 string

2 int

3 bool

4 array

5 object

 

这样就不奇怪刚刚类型那个值的显示了,ID,Math ,Chinese都是整形,姓名是字符串,然后再来一个例子

declare @v nvarchar(600) = N'{"ID":true,"name":null,"Chinese":9.9,"Math":"hello","arr":[1,2,3,4],"obj":{"name":"test"}}'select * from openjson(@v)key  value   typeID  true  3name   NULL  0Chinese  9.9  2Math  hello  1arr  [1,2,3,4]  4obj  {"name":"test"}  5 

这里就可以看到,即使是9.9这样的类型,使用openjson 也是会认为是整形的,所以即使可以解析出来类型,但是也不要太相信它能给你带来准确的数据类型就对了。
有人可能问,那如果是一个json里面包含多个行对象,其实是可以用openjson with 的格式来解析的,那它怎么认定呢?比如说

declare @v nvarchar(600) = N'[{"ID":1,"name":"张三","Chinese":90,"Math":80},{"ID":2,"name":"李四","Chinese":75,"Math":90},{"ID":3,"name":"王五","Chinese":68,"Math":100},{"ID":4,"name":"赵六","Chinese":100}]'

使用openjson来直接解析,很明显得出,4个列都是Object类型,仅此而已。

一般情况下,用的就是这部分咯~嗯~这次就到这里,下篇再写