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

Cómo hacer referencia a claves JSON que contienen caracteres especiales al usar OPENJSON, JSON_QUERY y JSON_VALUE (SQL Server)

Si está utilizando una función T-SQL como OPENJSON() , JSON_QUERY() o JSON_VALUE() , es posible que tenga cuidado con los caracteres no alfanuméricos que pueden estar en el documento JSON con el que está trabajando. Especialmente si esos caracteres especiales están en los nombres de las claves y necesita hacer referencia a esos nombres de claves.

Por ejemplo, podría tener un nombre de clave que contenga un espacio (como "first name" ), o un signo de dólar ($ ).

Afortunadamente, cada vez que haga referencia a dichas claves, simplemente puede encerrar el nombre de la clave entre comillas dobles.

Ejemplo 1:OPENJSON()

Aquí hay un ejemplo de cómo hacer referencia a una clave con un espacio en su nombre cuando se usa OPENJSON() .

DECLARE @json NVARCHAR(4000) = N'{
        "contact details" : {
            "client id" : 1, 
            "work phone" : "+61 987 902 029"
        }
    }';
SELECT * FROM OPENJSON(@json, '$."contact details"');

Resultado:

+------------+-----------------+--------+
| key        | value           | type   |
|------------+-----------------+--------|
| client id  | 1               | 2      |
| work phone | +61 987 902 029 | 1      |
+------------+-----------------+--------+

Aquí hay otro ejemplo, esta vez tenemos un signo de dólar en el nombre de la clave.

DECLARE @json NVARCHAR(4000) = N'{
        "$ per hour" : {
            "normal rate" : 80, 
            "overtime" : 160 
        }
    }';
SELECT * FROM OPENJSON(@json, '$."$ per hour"');

Resultado:

+-------------+---------+--------+
| key         | value   | type   |
|-------------+---------+--------|
| normal rate | 80      | 2      |
| overtime    | 160     | 2      |
+-------------+---------+--------+

Ejemplo 2:JSON_QUERY()

Aquí hay un ejemplo usando JSON_QUERY() .

DECLARE @json NVARCHAR(4000) = N'{
        "contact details" : {
            "client id" : 1, 
            "work phone" : "+61 987 902 029"
        }
    }';
SELECT JSON_QUERY(@json, '$."contact details"');

Resultado:

+--------------------+
| (No column name)   |
|--------------------|
| {
            "client id" : 1, 
            "work phone" : "+61 987 902 029"
        }                    |
+--------------------+

Y aquí está con un signo de dólar.

DECLARE @json NVARCHAR(4000) = N'{
        "$ per hour" : {
            "normal rate" : 80, 
            "overtime" : 160 
        }
    }';
SELECT JSON_QUERY(@json, '$."$ per hour"');

Resultado:

+--------------------+
| (No column name)   |
|--------------------|
| {
            "normal rate" : 80, 
            "overtime" : 160 
        }                    |
+--------------------+

Ejemplo 3:JSON_VALUE()

Este ejemplo usa JSON_VALUE() .

DECLARE @json NVARCHAR(4000) = N'{
        "contact details" : {
            "client id" : 1, 
            "work phone" : "+61 987 902 029"
        }
    }';
SELECT JSON_VALUE(@json, '$."contact details"."work phone"');

Resultado:

+--------------------+
| (No column name)   |
|--------------------|
| +61 987 902 029    |
+--------------------+

Y aquí está con un signo de dólar.

DECLARE @json NVARCHAR(4000) = N'{
        "$ per hour" : {
            "normal rate" : 80, 
            "overtime" : 160 
        }
    }';
SELECT JSON_VALUE(@json, '$."$ per hour"."normal rate"') AS [Normal Rate];

Resultado:

+---------------+
| Normal Rate   |
|---------------|
| 80            |
+---------------+