sql >> Databáze >  >> RDS >> Sqlserver

Jak přejmenovat klíč JSON v SQL Server (T-SQL)

Pokud jste používali JSON_MODIFY() k úpravě dokumentů JSON na serveru SQL Server, můžete být zvyklí na úpravu hodnoty součástí páru klíč/hodnota vlastnictví. Věděli jste ale, že můžete také upravit klíč část?

Trik, jak toho dosáhnout, je zkopírovat hodnotu do nového klíče a poté odstranit starý klíč.

Příklady níže.

Základní příklad

Zde je základní příklad, který ukazuje, co tím myslím.

-- 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

Výsledek:

{"Name":"Homer"}
{"Handle":"Homer"} 

Tím se vytiskne původní pár klíč/hodnota následovaný novým párem klíč/hodnota.

I když můžeme říci, že jsme klíč „přejmenovali“, ve skutečnosti jsme právě vytvořili nový klíč, zkopírovali existující hodnotu do tohoto nového klíče a poté smazali starý klíč nastavením na NULL .

V tomto případě jsme použili JSON_VALUE() funkce pro extrakci hodnoty.

Číselné hodnoty

Při kopírování dat do nového klíče musíte být opatrní. Ve výchozím nastavení jej SQL Server uzavře do dvojitých uvozovek. To může nebo nemusí být to, co chcete.

Pokud však kopírujete číselnou hodnotu, je pravděpodobné, že chcete, aby zůstala číselnou hodnotou (tj. bez uvozovek). V tomto případě budete muset použít CAST() funkci přetypovat jako číselný datový typ. Zde je příklad:

-- 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

Výsledek:

{"Residents":768}
{"Population":768} 

Výsledná hodnota je tedy číslo.

Pokud odstraníme CAST() funkce z tohoto příkladu, skončíme s tímto:

-- 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

Výsledek:

{"Residents": 768}
{"Population":"768"} 

V tomto případě jsme tedy nejen přejmenovali klíč, ale také jsme změnili datový typ (JSON) z čísla na řetězec.

Všimněte si, že JSON nerozlišuje mezi různými číselnými typy. Má pouze jeden číselný typ:číslo.

Klíče s mezerami

V tomto příkladu přejmenuji existující klíč na nový klíč, který obsahuje mezeru (skládá se ze dvou slov oddělených mezerou).

Protože nový klíč obsahuje mezeru, musím klíč obklopit dvojitými uvozovkami. Pokud to neudělám, dojde k chybě.

-- 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

Výsledek:

{"Population":68}
{"Average IQ":68} 

Vnořené vlastnosti

Pokud je vlastnost vnořená, žádný problém. K odkazování na něj jednoduše použijte tečkovou notaci.

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

Výsledek:

	{ 
"Suspect": { 
"Name": "Homer Simpson", 
"Hobbies": ["Eating", "Sleeping", "Base Jumping"] 
}
}
{ 
"Suspect": { 
"Name": "Homer Simpson" 
,"Qualifications":["Eating", "Sleeping", "Base Jumping"]}
} 

Možná jste si také všimli, že tento příklad používá JSON_QUERY() funkci pro extrakci hodnoty namísto JSON_VALUE() jako v předchozích příkladech.

Je to proto, že v tomto případě extrahujeme pole a JSON_VALUE() nemůže extrahovat celé pole (může z pole extrahovat pouze skalární hodnotu). JSON_QUERY() Funkce na druhé straně extrahuje objekty a pole, ale ne skalární hodnoty.

Další informace o tom naleznete v části JSON_QUERY() vs JSON_VALUE() :Jaký je rozdíl?


  1. SQL dotaz pro nalezení záznamu s ID, který není v jiné tabulce

  2. Načítání jednoho řádku, jednoho sloupce s CHOP

  3. Funkce RANK, DENSE_RANK a ROW_NUMBER v Oracle

  4. Vytvořte dočasnou tabulku v příkazu SELECT bez samostatné CREATE TABLE