- Categorias:
TRY_PARSE_JSON¶
Uma versão especial de PARSE_JSON que retorna um valor NULL se ocorrer um erro durante a análise.
Sintaxe¶
TRY_PARSE_JSON( <expr> )
Argumentos¶
expr
Uma expressão do tipo cadeia de caracteres (por exemplo, VARCHAR).
Retornos¶
O valor retornado é do tipo VARIANT
e contém um documento JSON.
Notas de uso¶
Esta função oferece suporte a uma expressão de entrada com um tamanho máximo de 8 MB comprimido.
Se a entrada for NULL, a saída também será NULL. Entretanto, se a cadeia de caracteres de entrada for
'null'
, ela é interpretada como um valor JSON nulo para que o resultado não seja SQL NULL, mas um valor VARIANT válido contendonull
.Ao analisar números decimais, esta função tenta preservar a exatidão da representação, tratando 123,45 como NUMBER(5,2), e não como DOUBLE. Entretanto, os números que utilizam notação científica (por exemplo, 1.2345e+02) ou números que não podem ser armazenados como decimais de pontos fixos devido a limitações de faixa ou escala são armazenados como DOUBLE. Como JSON não representa valores como TIMESTAMP, DATE, TIME ou BINARY nativamente, eles têm que ser representados como cadeias de caracteres.
Em JSON, um objeto (também chamado de “dicionário” ou “hash”) é um conjunto desordenado de pares chave-valor.
TO_JSON
eTRY_PARSE_JSON
são funções (quase) inversas ou recíprocas.A função
TRY_PARSE_JSON
pega uma cadeia de caracteres como entrada e retorna uma variante compatível com JSON. A funçãoTO_JSON
pega uma variante compatível com JSON e retorna uma cadeia de caracteres. O seguinte é (conceitualmente) verdadeiro se X for uma cadeia de caracteres contendo JSON válido:X = TO_JSON(TRY_PARSE_JSON(X));
Por exemplo, o seguinte é (conceitualmente) verdadeiro:
'{"pi":3.14,"e":2.71}' = TO_JSON(TRY_PARSE_JSON('{"pi":3.14,"e":2.71}'))
No entanto, as funções não são perfeitamente recíprocas por duas razões:
A ordem dos pares chave-valor na cadeia de caracteres produzida por
TO_JSON
não é previsível.A cadeia de caracteres produzida por
TO_JSON
pode ter menos espaço em branco do que a cadeia de caracteres passada paraTRY_PARSE_JSON
.
Os seguintes são JSON equivalentes, mas não cadeias de caracteres equivalentes:
{"pi": 3.14, "e": 2.71}
{"e":2.71,"pi":3.14}
Exemplos¶
Isto mostra um exemplo de armazenamento de diferentes tipos de dados em uma coluna VARIANT chamando TRY_PARSE_JSON
para analisar cadeias de caracteres de caracteres que contêm valores que podem ser analisados como JSON:
Criar e preencher uma tabela.
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 ');Consultar os dados, usando
TRY_PARSE_JSON
. Observe que o valor para a terceira linha é NULL. Se a consulta tivesse usadoPARSE_JSON
em vez deTRY_PARSE_JSON
, a consulta teria falhado.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 | +----+-------------------+