Al usar JSON con SQL Server, puede usar JSON_VALUE()
función para devolver un valor escalar de una cadena JSON.
Para usar esta función, proporciona dos argumentos; la expresión JSON y la propiedad a extraer.
Sintaxis
La sintaxis es así:
JSON_VALUE ( expression , path )
Donde expression
es la expresión de cadena JSON y path
es la propiedad que desea extraer de esa expresión.
El argumento de ruta puede incluir un modo de ruta opcional componente. Este modo de ruta opcional puede ser un valor de lax
o strict
. Este valor, si lo hay, viene antes del signo de dólar.
Ejemplo 1:uso básico
Aquí hay un ejemplo para demostrar el uso básico de JSON_VALUE()
función.
SELECT JSON_VALUE('{"Name": "Bruce"}', '$.Name') AS 'Result';
Resultado:
+----------+ | Result | |----------| | Bruce | +----------+
En este ejemplo:
- El
{"Name": "Bruce"}
El argumento es la expresión JSON (una pequeña, pero sigue siendo una expresión JSON válida). Las expresiones JSON consisten en un par clave/valor. En este caso,Name
es la clave,Bruce
es su valor. - El
$.Name
argumento es el camino. Esta ruta hace referencia al valor delName
clave de la expresión JSON. Entonces podemos extraer el valor haciendo referencia al nombre del par.
Ejemplo 2:matrices
Para extraer un valor de una matriz, haga referencia a su índice entre corchetes, seguido de la clave correspondiente. He aquí un ejemplo:
/* CREATE THE ARRAY (and put into a variable called @data) */ DECLARE @data NVARCHAR(4000) SET @data=N'{ "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] }' /* QUERY THE ARRAY */ SELECT JSON_VALUE(@data,'$.Cities[0].Name') AS 'Name', JSON_VALUE(@data,'$.Cities[0].CountryCode') AS 'Country Code', JSON_VALUE(@data,'$.Cities[0].District') AS 'District', JSON_VALUE(@data,'$.Cities[0].Population') AS 'Population' UNION ALL SELECT JSON_VALUE(@data,'$.Cities[1].Name') AS 'Name', JSON_VALUE(@data,'$.Cities[1].CountryCode') AS 'Country Code', JSON_VALUE(@data,'$.Cities[1].District') AS 'District', JSON_VALUE(@data,'$.Cities[1].Population') AS 'Population';
Resultado:
+----------+----------------+------------+--------------+ | Name | Country Code | District | Population | |----------+----------------+------------+--------------| | Kabul | AFG | Kabol | 1780000 | | Qandahar | AFG | Qandahar | 237500 | +----------+----------------+------------+--------------+
Entonces, en este ejemplo, creamos una matriz JSON y la colocamos en una variable llamada @data
. Luego ejecutamos una consulta, usando @data
como primer argumento de JSON_VALUE()
función (esto se debe a que @data
contiene la expresión JSON).
Las matrices usan numeración basada en cero, por lo que para extraer el primer elemento necesitamos usar Cities[0]
, el segundo Cities[1]
, y así sucesivamente.
Ejemplo 3:un ejemplo de base de datos
Si pusiéramos los datos del ejemplo anterior en una base de datos, podríamos reescribir la consulta de la siguiente manera:
SELECT JSON_VALUE(Document,'$.Cities[0].Name') AS 'Name', JSON_VALUE(Document,'$.Cities[0].CountryCode') AS 'Country Code', JSON_VALUE(Document,'$.Cities[0].District') AS 'District', JSON_VALUE(Document,'$.Cities[0].Population') AS 'Population' FROM Json_Documents UNION ALL SELECT JSON_VALUE(Document,'$.Cities[1].Name') AS 'Name', JSON_VALUE(Document,'$.Cities[1].CountryCode') AS 'Country Code', JSON_VALUE(Document,'$.Cities[1].District') AS 'District', JSON_VALUE(Document,'$.Cities[1].Population') AS 'Population' FROM Json_Documents
Resultado:
+----------+----------------+------------+--------------+ | Name | Country Code | District | Population | |----------+----------------+------------+--------------| | Kabul | AFG | Kabol | 1780000 | | Qandahar | AFG | Qandahar | 237500 | +----------+----------------+------------+--------------+
Esto supone que el documento JSON se almacena en una columna llamada Document
, que se encuentra en una tabla llamada Json_Documents
.
Ejemplo 4:modo de ruta
Como se mencionó, también tiene la opción de especificar el modo de ruta. Esto puede ser lax
o strict
.
El valor del modo de ruta determina lo que sucede cuando la expresión de ruta contiene un error. Específicamente:
- En laxa modo, la función devuelve valores vacíos si la expresión de ruta contiene un error. Por ejemplo, si solicita el valor $.name y el texto JSON no contiene un nombre tecla, la función devuelve nulo, pero no genera un error.
-
En estricto modo, la función genera un error si la expresión de ruta contiene un error.
El valor predeterminado es lax
.
Aquí hay un ejemplo para demostrar la diferencia entre estos dos modos.
Error en modo laxo
Esto es lo que sucede cuando la expresión de la ruta contiene un error mientras está en modo laxo.
SELECT JSON_VALUE('{"Name": "Bruce"}', 'lax $.Hobbies') AS 'Result';
Resultado:
+----------+ | Result | |----------| | NULL | +----------+
En este ejemplo, estamos tratando de hacer referencia a Hobbies
, pero esa clave no existe en el documento JSON. En este caso, obtenemos un valor nulo (porque estamos usando el modo laxo).
Error en modo estricto
Esto es lo que sucede cuando ejecutamos el mismo código en modo estricto.
SELECT JSON_VALUE('{"Name": "Bruce"}', 'strict $.Hobbies') AS 'Result';
Resultado:
Msg 13608, Level 16, State 1, Line 1 Property cannot be found on the specified JSON path.
Como era de esperar, el modo estricto hace que se muestre un mensaje de error.
Ejemplo 5:devolución de objetos y matrices
El JSON_VALUE()
La función no devuelve objetos y matrices. Si desea devolver un objeto o una matriz, utilice JSON_QUERY()
función en su lugar. Aquí hay un ejemplo donde uso ambas funciones dentro de una consulta.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Mae Sai", "Province": "Chiang Rai", "Country": "Thailand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_VALUE(@data,'$.Suspect.Name') AS 'Name', JSON_VALUE(@data,'$.Suspect.Address.Country') AS 'Country', JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies', JSON_VALUE(@data,'$.Suspect.Hobbies[2]') AS 'Last Hobby';
Resultado:
+---------------+-----------+----------------------------------------+--------------+ | Name | Country | Hobbies | Last Hobby | |---------------+-----------+----------------------------------------+--------------| | Homer Simpson | Thailand | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping | +---------------+-----------+----------------------------------------+--------------+
En este caso, uso JSON_VALUE()
para devolver varios valores escalares, y JSON_QUERY()
para devolver una matriz.
Entonces, si necesita devolver un objeto o una matriz (incluido todo el documento JSON), consulte JSON_QUERY()
Ejemplos en SQL Server.