如果你一直使用json_modify()函數(shù)來(lái)修改sql server中的json文檔,那么你可能習(xí)慣于修改key/value屬性的value部分。但是你知道你也可以修改key部分嗎?
這樣做的訣竅是將value復(fù)制到一個(gè)新鍵,然后刪除舊鍵。
這里有一個(gè)基本的例子來(lái)說(shuō)明我的意思。
--?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
結(jié)果:
{"Name":"Homer"} {"Handle":"Homer"}
這將打印出原始的鍵/值對(duì),然后是新的鍵/值對(duì)。
雖然我們可以說(shuō)我們“重命名”了密鑰,但實(shí)際上我們只是創(chuàng)建了一個(gè)新密鑰,將現(xiàn)有值復(fù)制到該新密鑰,然后將舊密鑰設(shè)置為NULL來(lái)刪除它。
在本例中,我們使用JSON_VALUE()函數(shù)來(lái)提取值。
數(shù)值
在將數(shù)據(jù)復(fù)制到新鍵時(shí)需要小心。默認(rèn)情況下,SQL Server將它括在雙引號(hào)中。這可能是你想要的,也可能不是。
但是,如果你復(fù)制一個(gè)數(shù)值,你可能希望它仍然是一個(gè)數(shù)值(即沒(méi)有雙引號(hào))。在本例中,需要使用CAST()函數(shù)將其轉(zhuǎn)換為數(shù)值數(shù)據(jù)類(lèi)型。這里有一個(gè)例子:
--?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
結(jié)果:
{"Residents":768} {"Population":768}
所以結(jié)果是一個(gè)數(shù)字。
如果我們從這個(gè)例子中刪除CAST()函數(shù),我們得到的結(jié)果是:
--?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
結(jié)果:
{"Residents":?768} {"Population":"768"}
因此,在本例中,我們不僅重命名了鍵,還將(JSON)數(shù)據(jù)類(lèi)型從數(shù)字更改為字符串。
注意,JSON不區(qū)分不同的數(shù)字類(lèi)型。它只有一個(gè)數(shù)字類(lèi)型:number。
key鍵和空格
在本例中,我將一個(gè)現(xiàn)有鍵重命名為一個(gè)包含空格的新鍵(它由兩個(gè)單詞組成,用空格分隔)。
因?yàn)樾骆I包含空格,所以我需要用雙引號(hào)括住鍵。如果不這樣做,就會(huì)出現(xiàn)錯(cuò)誤。
--?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
結(jié)果:
{"Population":68} {"Average?IQ":68}
嵌套的屬性
如果屬性是嵌套的,則沒(méi)有問(wèn)題。只需使用點(diǎn)符號(hào)來(lái)引用它。
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
結(jié)果:
{? "Suspect":?{? "Name":?"Homer?Simpson",? "Hobbies":?["Eating",?"Sleeping",?"Base?Jumping"]? } } {? "Suspect":?{? "Name":?"Homer?Simpson"? ,"Qualifications":["Eating",?"Sleeping",?"Base?Jumping"]} }
你可能還注意到,這個(gè)示例使用JSON_QUERY()函數(shù)來(lái)提取值,而不是像前面的示例那樣使用JSON_VALUE()。
這是因?yàn)樵诒纠校覀冋谔崛∫粋€(gè)數(shù)組,而JSON_VALUE()不能提取整個(gè)數(shù)組(它只能從數(shù)組中提取標(biāo)量值)。另一方面,JSON_QUERY()函數(shù)提取對(duì)象和數(shù)組,但不提取標(biāo)量值。