本文摘自PHP中文网,作者藏色散人,侵删。
如果你一直使用JSON_MODIFY()
函数来修改SQL Server中的JSON文档,那么你可能习惯于修改key/value
属性的value
部分。但是你知道你也可以修改key
部分吗?这样做的诀窍是将value复制到一个新键,然后删除旧键。
这里有一个基本的例子来说明我的意思。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | -- Declare a variable and assign some JSON to it
DECLARE @data NVARCHAR(50)= '{"Name":"Homer"}'
-- Print the current JSON
PRINT @data
-- Rename the key (by copying the value to a new key, then deleting the old one)
SET @data=
JSON_MODIFY(
JSON_MODIFY(@data, '$.Handle' , JSON_VALUE(@data, '$.Name' )),
'$.Name' ,
NULL
)
-- Print the new JSON
PRINT @data
|
结果:
1 2 | { "Name" : "Homer" }
{ "Handle" : "Homer" }
|
这将打印出原始的键/值对,然后是新的键/值对。
虽然我们可以说我们“重命名”了密钥,但实际上我们只是创建了一个新密钥,将现有值复制到该新密钥,然后将旧密钥设置为NULL来删除它。
在本例中,我们使用JSON_VALUE()
函数来提取值。
数值
在将数据复制到新键时需要小心。默认情况下,SQL Server将它括在双引号中。这可能是你想要的,也可能不是。
但是,如果你复制一个数值,你可能希望它仍然是一个数值(即没有双引号)。在本例中,需要使用CAST()
函数将其转换为数值数据类型。这里有一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | -- Declare a variable and assign some JSON to it
DECLARE @data NVARCHAR(50)= '{"Residents":768}'
-- Print the current JSON
PRINT @data
-- Rename the key (by copying the value to a new key, then deleting the old one)
SET @data=
JSON_MODIFY(
JSON_MODIFY(@data, '$.Population' , CAST(JSON_VALUE(@data, '$.Residents' ) AS int)),
'$.Residents' ,
NULL
)
-- Print the new JSON
PRINT @data
|
结果:
1 2 | { "Residents" :768}
{ "Population" :768}
|
所以结果是一个数字。
如果我们从这个例子中删除CAST()
函数,我们得到的结果是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | -- Declare a variable and assign some JSON to it
DECLARE @data NVARCHAR(50)= '{"Residents": 768}'
-- Print the current JSON
PRINT @data
-- Rename the key (by copying the value to a new key, then deleting the old one)
SET @data=
JSON_MODIFY(
JSON_MODIFY(@data, '$.Population' , JSON_VALUE(@data, '$.Residents' )),
'$.Residents' ,
NULL
)
-- Print the new JSON
PRINT @data
|
结果:
1 2 | { "Residents" : 768}
{ "Population" : "768" }
|
因此,在本例中,我们不仅重命名了键,还将(JSON)数据类型从数字更改为字符串。
注意,JSON不区分不同的数字类型。它只有一个数字类型:number。
key键和空格
在本例中,我将一个现有键重命名为一个包含空格的新键(它由两个单词组成,用空格分隔)。
因为新键包含空格,所以我需要用双引号括住键。如果不这样做,就会出现错误。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | -- Declare a variable and assign some JSON to it
DECLARE @data NVARCHAR(50)= '{"Population":68}'
-- Print the current JSON
PRINT @data
-- Rename the key (by copying the value to a new key, then deleting the old one)
SET @data=
JSON_MODIFY(
JSON_MODIFY(@data, '$."Average IQ"' , CAST(JSON_VALUE(@data, '$.Population' ) AS int)),
'$.Population' ,
NULL
)
-- Print the new JSON
PRINT @data
|
结果:
1 2 | { "Population" :68}
{ "Average IQ" :68}
|
嵌套的属性
如果属性是嵌套的,则没有问题。只需使用点符号来引用它。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | DECLARE @data NVARCHAR(4000)
SET @data=N'{
"Suspect" : {
"Name" : "Homer Simpson" ,
"Hobbies" : [ "Eating" , "Sleeping" , "Base Jumping" ]
}
}'
PRINT @data
SET @data=
JSON_MODIFY(
JSON_MODIFY(@data, '$.Suspect.Qualifications' , JSON_QUERY(@data, '$.Suspect.Hobbies' )),
'$.Suspect.Hobbies' ,
NULL
)
PRINT @data
|
结果:
1 2 3 4 5 6 7 8 9 10 11 | {
"Suspect" : {
"Name" : "Homer Simpson" ,
"Hobbies" : [ "Eating" , "Sleeping" , "Base Jumping" ]
}
}
{
"Suspect" : {
"Name" : "Homer Simpson"
, "Qualifications" :[ "Eating" , "Sleeping" , "Base Jumping" ]}
}
|
你可能还注意到,这个示例使用JSON_QUERY()
函数来提取值,而不是像前面的示例那样使用JSON_VALUE()
。
这是因为在本例中,我们正在提取一个数组,而JSON_VALUE()
不能提取整个数组(它只能从数组中提取标量值)。另一方面,JSON_QUERY()
函数提取对象和数组,但不提取标量值。
相关推荐:《SQL教程》《MySQL教程》
以上就是如何在SQL Server中重命名JSON密钥(T-SQL)?的详细内容,更多文章请关注木庄网络博客!
相关阅读 >>
实例讲解mysql 慢查询
c#的sql操作类实例
mysql索引详解及演进过程及面试题延伸
sql server之数据类型详解
sqlserver 锁表语句分享
mysql5.7.14下载安装图文教程及mysql数据库语句入门大全
sql 优化的几种方法
spring boot实现简单的增删改查
sql优化老出错,那是你没弄明白mysql解释计划用法
mysql 带多个条件的查询方式
更多相关阅读请进入《sql》频道 >>
机械工业出版社
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。
转载请注明出处:木庄网络博客 » 如何在SQL Server中重命名JSON密钥(T-SQL)?