sql >> Base de Datos >  >> RDS >> Sqlserver

JSON_QUERY() Ejemplos en SQL Server (T-SQL)

Cuando use JSON con SQL Server, puede usar JSON_QUERY() función para extraer un objeto o una matriz de una cadena JSON.

Para usar esta función, proporcione la expresión JSON como argumento. También puede proporcionar un segundo argumento (opcional) para especificar el objeto o la matriz a extraer.

Sintaxis

La sintaxis es así:

JSON_QUERY ( expression [ , path ] )  

Donde expression es la expresión de cadena JSON y path es el objeto o matriz que desea extraer de esa expresión. La path El argumento es opcional (si no lo proporciona, se devuelve todo el documento JSON).

El argumento de ruta (si se proporciona) puede incluir un modo de ruta opcional componente. Este modo de ruta opcional puede ser un valor de lax o strict . Este valor determina lo que sucede en caso de que la ruta proporcionada no sea válida. El modo de ruta (si se proporciona) viene antes del signo de dólar.

Ejemplo 1:uso básico

Aquí hay un ejemplo para demostrar el uso básico de JSON_QUERY() función.

DECLARE @data NVARCHAR(4000)
SET @data=N'{
    "Cities": [
        {
            "Name": "Kabul",
            "CountryCode": "AFG",
            "District": "Kabol",
            "Population": 1780000
        },
        {
            "Name": "Qandahar",
            "CountryCode": "AFG",
            "District": "Qandahar",
            "Population": 237500
        }
    ]
}'
SELECT JSON_QUERY(@data, '$.Cities[0]') AS 'Result';

Resultado:

+----------+
| Result   |
|----------|
| {
            "Name": "Kabul",
            "CountryCode": "AFG",
            "District": "Kabol",
            "Population": 1780000
        }          |
+----------+

En este ejemplo, primero declaro y configuro una variable llamada @data . Luego asigno una matriz a esta variable. Una vez hecho esto, ejecuto una consulta en esa matriz.

En este caso uso Cities[0] para hacer referencia al primer elemento de la matriz (las matrices JSON usan numeración basada en cero).

Podría acceder al segundo elemento usando Cities[1] . Así:

DECLARE @data NVARCHAR(4000)
SET @data=N'{
    "Cities": [
        {
            "Name": "Kabul",
            "CountryCode": "AFG",
            "District": "Kabol",
            "Population": 1780000
        },
        {
            "Name": "Qandahar",
            "CountryCode": "AFG",
            "District": "Qandahar",
            "Population": 237500
        }
    ]
}'
SELECT JSON_QUERY(@data, '$.Cities[1]') AS 'Result';

Resultado:

+----------+
| Result   |
|----------|
| {
            "Name": "Qandahar",
            "CountryCode": "AFG",
            "District": "Qandahar",
            "Population": 237500
        }          |
+----------+

Ejemplo 2:devolver la expresión JSON completa

El segundo argumento es opcional, por lo que si lo omite, se devuelve todo el documento JSON. Esto es lo que sucede cuando hacemos eso usando los mismos datos de los ejemplos anteriores:

DECLARE @data NVARCHAR(4000)
SET @data=N'{
    "Cities": [
        {
            "Name": "Kabul",
            "CountryCode": "AFG",
            "District": "Kabol",
            "Population": 1780000
        },
        {
            "Name": "Qandahar",
            "CountryCode": "AFG",
            "District": "Qandahar",
            "Population": 237500
        }
    ]
}'
SELECT JSON_QUERY(@data) AS 'Result';

Resultado:

+----------+
| Result   |
|----------|
| {
    "Cities": [
        {
            "Name": "Kabul",
            "CountryCode": "AFG",
            "District": "Kabol",
            "Population": 1780000
        },
        {
            "Name": "Qandahar",
            "CountryCode": "AFG",
            "District": "Qandahar",
            "Population": 237500
        }
    ]
}          |
+----------+

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_QUERY(Document,'$.Cities[0]') AS 'City 1'
FROM Json_Documents

Resultado:

+----------+
| City 1   |
|----------|
| {
            "ID": 1,
            "Name": "Kabul",
            "CountryCode": "AFG",
            "District": "Kabol",
            "Population": 1780000
        }          |
+----------+

Esto supone que el documento JSON se almacena en una columna llamada Document , que se encuentra en una tabla llamada Json_Documents .

Ejemplo 4:valores escalares

El JSON_QUERY() La función no está diseñada para devolver valores escalares. Si desea devolver un valor escalar, use JSON_VALUE() en su lugar.

Sin embargo, no hay nada que le impida combinar ambas funciones dentro de una consulta para devolver datos en varios niveles de granularidad.

He aquí un ejemplo:

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_VALUE(@data,'$.Suspect.Name') AS 'Name',
   JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies',
   JSON_VALUE(@data,'$.Suspect.Hobbies[2]') AS 'Last Hobby';

Resultado:

+---------------+----------------------------------------+--------------+
| Name          | Hobbies                                | Last Hobby   |
|---------------+----------------------------------------+--------------|
| Homer Simpson | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping |
+---------------+----------------------------------------+--------------+

En este ejemplo utilicé JSON_VALUE() para extraer varios valores escalares, pero también usé JSON_QUERY() para devolver una matriz completa (que JSON_VALUE() no puedo hacer).

Ejemplo 5: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_QUERY('{"Name": "Bruce"}', 'lax $.Name') AS 'Result';

Resultado:

+----------+
| Result   |
|----------|
| NULL     |
+----------+

En este ejemplo, intentamos devolver un valor escalar, pero JSON_QUERY() no hace valores escalares. Como se mencionó, solo devuelve objetos y matrices. 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_QUERY('{"Name": "Bruce"}', 'strict $.Name') AS 'Result';

Resultado:

Msg 13624, Level 16, State 2, Line 1
Object or array cannot be found in the specified JSON path.

Como era de esperar, el modo estricto da como resultado un mensaje de error que explica el error.