如何在SQL Server中重命名JSON密鑰(T-SQL)?

如果你一直使用json_modify()函數(shù)來(lái)修改sql server中的json文檔,那么你可能習(xí)慣于修改key/value屬性的value部分。但是你知道你也可以修改key部分嗎?

如何在SQL Server中重命名JSON密鑰(T-SQL)?

這樣做的訣竅是將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)量值。

相關(guān)推薦:《SQL教程》《SQL教程

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊14 分享