- Catégories :
Fonctions de données semi-structurées et structurées (analyse)
TRY_PARSE_JSON¶
Une version spéciale de PARSE_JSON qui renvoie une valeur NULL si une erreur se produit pendant l’analyse.
Syntaxe¶
TRY_PARSE_JSON( <expr> )
Arguments¶
expr
Une expression de type chaîne (par exemple, VARCHAR).
Renvoie¶
La valeur renvoyée est de type VARIANT
et contient un document JSON.
Notes sur l’utilisation¶
Cette fonction prend en charge une expression d’entrée avec une taille maximale de 8 MB compressée.
Si l’entrée est NULL, la sortie est NULL aussi. Toutefois, si la chaîne entrée est
'null'
, elle est interprétée comme une valeur JSON nulle de sorte que le résultat ne soit pas SQL NULL, mais une valeur VARIANT valide contenantnull
.Lors de l’analyse des nombres décimaux, cette fonction tente de préserver l’exactitude de la représentation en considérant 123,45 comme NUMBER(5,2) et non comme DOUBLE. Toutefois, les nombres utilisant une notation scientifique (c’est-à-dire 1.2345e + 02) ou des nombres qui ne peuvent pas être stockés sous forme de nombres décimaux à virgule fixe en raison de limitations de plage ou d’échelle sont stockés sous la forme DOUBLE. Comme JSON ne représente pas des valeurs telles que TIMESTAMP, DATE, TIME ou BINARY de manière native, celles-ci doivent être représentées sous forme de chaînes.
Dans JSON, un objet (également appelé « dictionnaire » ou « hachage ») est un ensemble non ordonné de paires clé-valeur.
TO_JSON
etTRY_PARSE_JSON
sont (presque) des fonctions converses ou réciproques.La fonction
TRY_PARSE_JSON
prend une chaîne en entrée et renvoie une variante compatible avec JSON. La fonctionTO_JSON
utilise une variante compatible avec JSON et renvoie une chaîne. Conceptuellement, ce qui suit est vrai si X est une chaîne contenant du code JSON valide :X = TO_JSON(TRY_PARSE_JSON(X));
Par exemple, ce qui suit est vrai (conceptuellement) :
'{"pi":3.14,"e":2.71}' = TO_JSON(TRY_PARSE_JSON('{"pi":3.14,"e":2.71}'))
Cependant, les fonctions ne sont pas parfaitement réciproques pour deux raisons :
L’ordre des paires clé-valeur dans la chaîne produite par
TO_JSON
n’est pas prévisible.La chaîne produite par
TO_JSON
peut avoir moins d’espaces que la chaîne transmise àTRY_PARSE_JSON
.
Les éléments suivants sont des équivalents JSON, mais pas des chaînes équivalentes :
{"pi": 3.14, "e": 2.71}
{"e":2.71,"pi":3.14}
Exemples¶
Cela montre un exemple de stockage de différents types de données dans une colonne VARIANT en appelant TRY_PARSE_JSON
pour analyser des chaînes contenant des valeurs pouvant être analysées comme JSON :
Créez et remplissez une table.
create or replace temporary table vartab (ID INTEGER, v VARCHAR); insert into vartab (id, v) VALUES (1, '[-1, 12, 289, 2188, false,]'), (2, '{ "x" : "abc", "y" : false, "z": 10} '), (3, '{ "bad" : "json", "missing" : true, "close_brace": 10 ');Interroger les données à l’aide de
TRY_PARSE_JSON
. Notez que la valeur de la troisième ligne est NULL. Si la requête avait utiliséPARSE_JSON
plutôt queTRY_PARSE_JSON
, la requête aurait échoué.SELECT ID, try_parse_json(v) FROM vartab ORDER BY ID; +----+-------------------+ | ID | TRY_PARSE_JSON(V) | |----+-------------------| | 1 | [ | | | -1, | | | 12, | | | 289, | | | 2188, | | | false, | | | undefined | | | ] | | 2 | { | | | "x": "abc", | | | "y": false, | | | "z": 10 | | | } | | 3 | NULL | +----+-------------------+