O AnalyticDB for MySQL oferece suporte ao tipo de dados JSON para armazenar e consultar dados semiestruturados cujos campos variam entre linhas ou mudam ao longo do tempo. Este tópico aborda os requisitos de formato, como gravar e consultar dados JSON e como expandir arrays JSON em linhas.
Observações de uso
As strings JSON devem seguir a especificação padrão do formato JSON.
Colunas JSON não aceitam valores padrão.
Requisitos de formato JSON
Chaves
Delimite cada chave com aspas duplas. Por exemplo, "addr" em {"addr":"xyz"}.
Valores
Um valor pode ser de um dos seguintes tipos: BOOLEAN, NUMBER, VARCHAR, ARRAY, OBJECT ou NULL.
BOOLEAN
Escreva true ou false em letras minúsculas. Não use 1 ou 0.
NUMBER
Informe valores numéricos diretamente, sem aspas.
Ao usar índices JSON, os valores NUMBER não podem exceder o intervalo de valores do tipo DOUBLE.
VARCHAR (string)
Delimite valores de string com aspas duplas.
Se a string contiver aspas duplas, escape cada uma com uma barra invertida. Por exemplo, o valor xyz"ab"c é escrito como "xyz\"ab\"c". Barras invertidas também exigem escape; portanto, a entrada JSON completa torna-se {"addr":"xyz\\"ab\\"c"}.
ARRAY
Os arrays podem ser simples ou aninhados:
Simples:
{"hobby":["basketball", "football"]}Aninhado:
{"addr":[{"city":"beijing", "no":0}, {"city":"shenzhen", "no":0}]}
NULL
Escreva Null diretamente.
Consultas específicas por tipo
Uma mesma chave pode conter valores de tipos diferentes em linhas distintas. As consultas retornam resultados correspondentes ao tipo do valor usado na comparação.
Por exemplo:
INSERT INTO test_tb1 VALUES ({"id": 1})— armazenaidcomo o número1INSERT INTO test_tb1 VALUES ({"id": "1"})— armazenaidcomo a string"1"
Nas consultas:
WHERE json_extract(col, '$.id') = 1retorna apenas as linhas em queidé o número1WHERE json_extract(col, '$.id') = '1'retorna apenas as linhas em queidé a string"1"
Exemplos
Todos os exemplos desta seção utilizam a tabela json_test definida abaixo, que abrange os principais tipos de valor: objetos, arrays, strings, números e booleanos.
Crie uma tabela
CREATE TABLE json_test(
id int,
vj json
)
DISTRIBUTED BY HASH(id);
Gravar dados
Grave em colunas JSON da mesma forma que em colunas VARCHAR: delimite a string JSON com aspas simples.
INSERT INTO json_test VALUES(0, '{"id":0, "name":"abc", "age":0}');
INSERT INTO json_test VALUES(1, '{"id":1, "name":"abc", "age":10, "gender":"f"}');
INSERT INTO json_test VALUES(2, '{"id":3, "name":"xyz", "age":30, "company":{"name":"alibaba", "place":"hangzhou"}}');
INSERT INTO json_test VALUES(3, '{"id":5, "name":"a\\"b\\"c", "age":50, "company":{"name":"alibaba", "place":"america"}}');
INSERT INTO json_test VALUES(4, '{"a":1, "b":"abc-char", "c":true}');
INSERT INTO json_test VALUES(5, '{"uname":{"first":"lily", "last":"chen"}, "addr":[{"city":"beijing", "no":1}, {"city":"shenzhen", "no":0}], "age":10, "male":true, "like":"fish", "hobby":["basketball", "football"]}');
Consultar dados com json_extract
Sintaxe
json_extract(json, jsonpath)
Parâmetros
|
Parâmetro |
Descrição |
|
|
Nome da coluna JSON. |
|
|
Caminho até a chave de destino, separado por pontos ( |
Retorna o valor especificado por jsonpath no JSON. Para outras funções, consulte Funções JSON.
Exemplos de consulta
Os exemplos abaixo usam a tabela json_test criada anteriormente.
Consulta básica — recuperar um único campo:
SELECT json_extract(vj,'$.name') FROM json_test WHERE id=1;
Consultas de igualdade:
SELECT id, vj FROM json_test WHERE json_extract(vj, '$.name') = 'abc';
SELECT id, vj FROM json_test WHERE json_extract(vj, '$.c') = true;
SELECT id, vj FROM json_test WHERE json_extract(vj, '$.age') = 30;
SELECT id, vj FROM json_test WHERE json_extract(vj, '$.company.name') = 'alibaba';
Consultas de intervalo:
SELECT id, vj FROM json_test WHERE json_extract(vj, '$.age') > 0;
SELECT id, vj FROM json_test WHERE json_extract(vj, '$.age') < 100;
SELECT id, vj FROM json_test WHERE json_extract(vj, '$.name') > 'a' and json_extract(vj, '$.name') < 'z';
Verificações de NULL:
SELECT id, vj FROM json_test WHERE json_extract(vj, '$.remark') is null;
SELECT id, vj FROM json_test WHERE json_extract(vj, '$.name') is not null;
Consultas IN:
SELECT id, vj FROM json_test WHERE json_extract(vj, '$.name') in ('abc','xyz');
SELECT id, vj FROM json_test WHERE json_extract(vj, '$.age') in (10,20);
Consultas LIKE:
SELECT id, vj FROM json_test WHERE json_extract(vj, '$.name') like 'ab%';
SELECT id, vj FROM json_test WHERE json_extract(vj, '$.name') like '%bc%';
SELECT id, vj FROM json_test WHERE json_extract(vj, '$.name') like '%bc';
Consultas de elementos de array — selecione elementos do array por índice (base zero):
SELECT id, vj FROM json_test WHERE json_extract(vj, '$.addr[0].city') = 'beijing' and json_extract(vj, '$.addr[1].no') = 0;
Consultas em arrays exigem um índice específico. Não há suporte para iteração sobre todo o array.
Expandir arrays JSON com unnest
A função unnest expande um array JSON para que cada elemento se torne uma linha separada no conjunto de resultados. Requer versão de kernel do cluster 3.2.5 ou posterior.
Para verificar e atualizar a versão secundária do seu cluster, acesse a seção Configuration Information na página Cluster Information no console do AnalyticDB for MySQL.
Sintaxe
unnest(json_array)
Parâmetro
json_array: Um valor de array JSON.
Exemplo
SELECT * FROM unnest(json '[{"a":"123"},{"a":"456"}]');
Resultado:
+-------------+
| _col0 |
+-------------+
| {"a":"123"} |
| {"a":"456"} |
+-------------+