Este tópico descreve as funções JSON compatíveis com clusters do AnalyticDB for MySQL.
JSON_ARRAY_CONTAINS: Verifica se um array JSON contém o
valueespecificado.JSON_ARRAY_LENGTH: Retorna o comprimento de um array JSON.
JSON_CONTAINS (para versões 3.1.5.0 e posteriores): Verifica se o caminho especificado contém o valor
candidate. Se nenhum caminho for especificado, a função verifica se o destino contém o valorcandidate.JSON_CONTAINS_PATH (para versões 3.1.5.0 e posteriores): Verifica se um documento JSON contém algum ou todos os caminhos especificados.
JSON_EXTRACT: Extrai dados de um documento JSON no
json_pathespecificado.JSON_KEYS: Se
json_pathfor especificado, retorna todas as chaves do caminho indicado em um documento JSON. Casojson_pathnão seja especificado, retorna todas as chaves do caminho raiz (json_path='$').JSON_OVERLAPS (para versões 3.1.10.6 e posteriores): Verifica se um documento JSON contém qualquer um dos elementos especificados, como
candidate1,candidate2oucandidate3.JSON_REMOVE (para versões 3.1.10.0 e posteriores): Remove o elemento no
json_pathespecificado de um documentojsone retorna a string modificada. Usearray[json_path,json_path,...]para especificar vários elementos para remoção.JSON_SIZE: Retorna o tamanho do objeto ou array JSON no
json_pathespecificado.JSON_SET (para versões 3.2.2.8 e posteriores): Insere ou atualiza dados em um documento
jsonnojson_pathespecificado e retorna o documentojsonatualizado.JSON_UNQUOTE (versões 3.2.2.11 e posteriores): Remove as aspas duplas de
json_value, processa caracteres de escape específicos emjson_valuee retorna o valor resultante.
JSON_ARRAY_CONTAINS
json_array_contains(json, value)
Descrição: Verifica se um array JSON contém o
valueespecificado.Tipo de valor de entrada:
valuepode ser numérico, string ou BOOLEAN.Tipo de valor de retorno: BOOLEAN.
-
Exemplo:
-
Verifique se o array JSON
[1, 2, 3]contém o elemento2. Instrução:SELECT json_array_contains('[1, 2, 3]', 2);Resultado retornado:
+-------------------------------------+ | json_array_contains('[1, 2, 3]', 2) | +-------------------------------------+ | 1 | +-------------------------------------+
-
JSON_ARRAY_LENGTH
json_array_length(json)
Descrição: Retorna o comprimento de um array JSON.
Tipo de valor de entrada: String ou JSON.
Tipo de valor de retorno: BIGINT.
-
Exemplo:
-
Obtenha o comprimento do array JSON
[1, 2, 3]. Instrução:SELECT json_array_length('[1, 2, 3]');Resultado retornado:
+--------------------------------+ | json_array_length('[1, 2, 3]') | +--------------------------------+ | 3 | +--------------------------------+
-
JSON_CONTAINS
A função JSON_CONTAINS verifica se um documento JSON especificado contém um valor específico. O uso de um índice de array JSON nas consultas evita varreduras completas de tabela ou a análise de todo o documento JSON, melhorando a eficiência da consulta.
Sem índice JSON
Esta sintaxe é compatível apenas com clusters cuja versão do kernel seja 3.1.5.0 ou posterior.
Para visualize e atualize a versão secundária, acesse a seção Configuration Information na página Cluster Information no console do AnalyticDB for MySQL.
json_contains(target, candidate[, json_path])
-
Descrição:
Se
json_pathfor especificado, a função verifica se o caminho indicado contém o valorcandidate. Retorna1se o valor estiver contido e0caso contrário.Se
json_pathnão for especificado, a função verifica se o destino contém o valorcandidate. Retorna1se o valor estiver contido e0caso contrário.
Regras:
Se tanto
targetquantocandidateforem tipos primitivos (NUMBER, BOOLEAN, STRING ou NULL), considera-se que o destino contém o candidato se eles forem iguais.Se tanto
targetquantocandidateforem arrays JSON, considera-se que o destino contém o candidato se todos os elementos decandidateestiverem contidos em qualquer elemento detarget.Se
targetfor um array ecandidatenão for um array, considera-se que o destino contém o candidato secandidateestiver contido em qualquer elemento detarget.Se tanto
targetquantocandidateforem objetos JSON, considera-se que o destino contém o candidato se cada chave emcandidatetambém existir emtarget, e o valor de cada chave emcandidateestiver contido no valor da chave correspondente emtarget.
Tipo de valor de entrada:
targetecandidatesão do tipo JSON.json_pathé do tipo JSONPATH.Tipo de valor de retorno: BOOLEAN.
-
Exemplos:
-
Verifique se o caminho
$.acontém o valor1. Instrução:SELECT json_contains(json '{"a": 1, "b": 2, "c": {"d": 4}}', json '1', '$.a') as result;Resultado retornado:
+--------+ | result | +--------+ | 1 | +--------+ -
Verifique se o caminho
$.bcontém o valor1. Instrução:SELECT json_contains(json '{"a": 1, "b": 2, "c": {"d": 4}}', json '1', '$.b') as result;Resultado retornado:
+--------+ | result | +--------+ | 0 | +--------+ -
Verifique se
{"d": 4}está contido no destino. Instrução:SELECT json_contains(json '{"a": 1, "b": 2, "c": {"d": 4}}', json '{"d": 4}') as result;Resultado retornado:
+--------+ | result | +--------+ | 0 | +--------+
-
Usando um índice de array JSON
Esta sintaxe é compatível apenas com clusters cuja versão do kernel seja 3.1.10.6 ou posterior.
Crie um índice de array JSON para a coluna JSON especificada. Para obter mais informações, consulte Criar um índice de array JSON.
Adicione
EXPLAINantes da instrução de consulta SQL para visualizar o plano de execução. Se o plano de execução não contiver o operadorScanFilterProject, o índice de array JSON foi utilizado com sucesso. Caso contrário, o índice não foi usado.
json_contains(json_path, cast('[candidate1,candidate2,candidate3]' as json))
Descrição: Verifica se o documento JSON especificado contém todos os elementos indicados, como
candidate1,candidate2ecandidate3.Tipos de dados dos valores de entrada: Os valores
candidate1,candidate2,candidate3,...devem ser todos do mesmo tipo de dado, seja numérico ou string.Tipo de valor de retorno: VARCHAR.
-
Exemplos:
-
Verifique se a coluna JSON especificada
vjcontémCP-018673eCP-018671.SELECT json_contains(vj, cast('["CP-018673","CP-018671"]' AS json)) FROM json_test;Resultado retornado:
+------------------------------------------------------------+ |json_contains(vj, cast('["CP-018673","CP-018671"]' AS json))| | +------------------------------------------------------------+ | 0 | +------------------------------------------------------------+ | 0 | +------------------------------------------------------------+ | 1 | +------------------------------------------------------------+ | 0 | +------------------------------------------------------------+ | 0 | +------------------------------------------------------------+ -
Verifique se a coluna JSON especificada
vjcontémCP-018673,1e2.SELECT json_contains(vj, cast('["CP-018673",1,2]' AS json)) FROM json_test;Resultado retornado:
+------------------------------------------------------------+ |json_contains(vj, cast('["CP-018673","CP-018671"]' AS json))| | +------------------------------------------------------------+ | 0 | +------------------------------------------------------------+ | 1 | +------------------------------------------------------------+ | 1 | +------------------------------------------------------------+ | 0 | +------------------------------------------------------------+ | 1 | +------------------------------------------------------------+
-
JSON_CONTAINS_PATH
json_contains_path(json, one_or_all, json_path[, json_path,...])
Esta função é compatível apenas com clusters cuja versão do kernel seja 3.1.5.0 ou posterior.
Para visualize e atualize a versão secundária, acesse a seção Configuration Information na página Cluster Information no console do AnalyticDB for MySQL.
-
Descrição do comando: Verifica se o caminho especificado existe no objeto JSON.
Se
one_or_allestiver definido como'one', a função retorna1se o documento JSON contiver qualquer um dos caminhos especificados. Caso contrário, retorna0.Se
one_or_allestiver definido como'all', a função retorna1se o documento JSON contiver todos os caminhos especificados. Caso contrário, retorna0.
Tipo de valor de entrada:
jsoné do tipo JSON.one_or_allé do tipo VARCHAR e pode ser'one'ou'all'(não diferencia maiúsculas de minúsculas).json_pathé uma expressão de caminho.Tipo de valor de retorno: BOOLEAN.
-
Exemplos:
-
Verifique se o documento JSON contém pelo menos um dos caminhos
$.ae$.e. Instrução:SELECT json_contains_path(json '{"a": 1, "b": 2, "c": {"d": 4}}', 'one', '$.a', '$.e') AS RESULT;Resultado retornado:
+--------+ | result | +--------+ | 1 | +--------+ -
Verifique se o documento JSON contém ambos os caminhos
$.ae$.e. Instrução:SELECT json_contains_path(json '{"a": 1, "b": 2, "c": {"d": 4}}', 'all', '$.a', '$.e') AS RESULT;Resultado retornado:
+--------+ | result | +--------+ | 0 | +--------+
-
JSON_EXTRACT
O valor de retorno da função
JSON_EXTRACT, assim como colunas do tipo JSON, não oferece suporte aORDER BY.Ao usar a função
JSON_EXTRACTcom a funçãoJSON_UNQUOTE, utilize primeiro CAST AS VARCHAR para converter o valor de retorno deJSON_EXTRACTpara o tipo VARCHAR. O valor convertido pode então ser usado como parâmetro de entrada para a funçãoJSON_UNQUOTE.
json_extract(json, json_path)
-
Descrição: Extrai um valor de um documento JSON no
json_pathespecificado. Se uma chave no documentojsoncontiver caracteres especiais, como$ou., o formato dejson_pathdeve ser'$["Key"]'.Por exemplo, se a chave for
$data,json_pathdeve ser'$["$data"]'. Tipo de valor de entrada: String ou JSON.
Tipo de valor de retorno: JSON.
-
Exemplos:
-
Obtenha o valor no caminho
$[0]do array[10, 20, [30, 40]]. Instrução:SELECT json_extract('[10, 20, [30, 40]]', '$[0]');Resultado retornado:
+-------------------------------------------+ | json_extract('[10, 20, [30, 40]]', '$[0]') | +-------------------------------------------+ | 10 | +-------------------------------------------+ -
Obtenha o valor do caminho
$datede{"id":"1","$date":"12345"}. Instrução:SELECT JSON_EXTRACT('{"id":"1","$date":"12345"}', '$["$date"]');Resultado retornado:
+---------------------------------------------------------+ |JSON_EXTRACT('{"id":"1","$date":"12345"}', '$["$date"]') | +---------------------------------------------------------+ | "12345" | +---------------------------------------------------------+
-
JSON_KEYS
json_keys(json[, json_path])
-
Descrição
Se
json_pathfor especificado, a função retorna todas as chaves do caminho indicado no documento JSON.Se
json_pathnão for especificado, a função retorna todas as chaves do caminho raiz (json_path='$').
-
Tipo de valor de entrada: Apenas parâmetros do tipo JSON são suportados.
Construa dados JSON das seguintes maneiras:
Use dados JSON diretamente. Por exemplo,
json '{"a": 1, "b": {"c": 30}}'.Converta explicitamente uma string para dados JSON usando a função CAST. Por exemplo,
CAST('{"a": 1, "b": {"c": 30}}' AS json).
Tipo de valor de retorno: JSON ARRAY.
-
Exemplos:
-
Obtenha todas as chaves do caminho
$.b. Instrução:SELECT json_keys(CAST('{"a": 1, "b": {"c": 30}}' AS json),'$.b');Resultado retornado:
+-----------------------------------------------------------+ | json_keys(CAST('{"a": 1, "b": {"c": 30}}' AS json),'$.b') | +-----------------------------------------------------------+ | ["c"] | +-----------------------------------------------------------+ -
Obtenha todas as chaves do caminho raiz. Instrução:
SELECT JSON_KEYS(json '{"a": 1, "b": {"c": 30}}');Resultado retornado:
+--------------------------------------------+ | JSON_KEYS(json '{"a": 1, "b": {"c": 30}}') | +--------------------------------------------+ | ["a","b"] | +--------------------------------------------+
-
JSON_OVERLAPS
Esta sintaxe é compatível apenas com clusters cuja versão do kernel seja 3.1.10.6 ou posterior.
Crie um índice de array JSON para a coluna JSON especificada. Para obter mais informações, consulte Criar um índice de array JSON.
Adicione
EXPLAINantes da instrução de consulta SQL para visualizar o plano de execução. Se o plano de execução não contiver o operadorScanFilterProject, o índice de array JSON foi utilizado com sucesso. Caso contrário, o índice não foi usado.
json_overlaps(json, cast('[candidate1,candidate2,candidate]' as json))
Descrição: Verifica se o documento JSON especificado contém qualquer um dos elementos indicados, como
candidate1,candidate2oucandidate3.Tipos de dados dos valores de entrada:
candidate1,candidate2,candidate3,...podem ser do tipo numérico ou string, e todos os valores devem ter o mesmo tipo de dado.Tipo de valor de retorno: VARCHAR.
-
Exemplos:
-
Retorne dados da coluna JSON especificada
vjque contenhamCP-018673.SELECT * FROM json_test WHERE json_overlaps(vj, cast('["CP-018673"]' AS json));Resultado retornado:
+-----+----------------------------------------------------------------------------+ | id | vj | +-----+----------------------------------------------------------------------------+ | 2 | ["CP-018673", 1, false] | +-----+----------------------------------------------------------------------------+ | 3 | ["CP-018673", 1, false, {"a": 1}] | +-----+----------------------------------------------------------------------------+ | 5 | ["CP-018673","CP-018671","CP-018672","CP-018670","CP-018669","CP-018668"] | +-----+----------------------------------------------------------------------------+ -
Retorne dados da coluna JSON especificada
vjque contenham qualquer um dos elementos1,2ou3.SELECT * FROM json_test WHERE json_overlaps(vj, cast('[1,2,3]' AS json))Resultado retornado:
+-----+-------------------------------------+ | id | vj | +-----+-------------------------------------+ | 1 | [1,2,3] | +-----+-------------------------------------+ | 2 | ["CP-018673", 1, false] | +-----+-------------------------------------+ | 3 | ["CP-018673", 1, false, {"a": 1}] | +-----+-------------------------------------+
-
JSON_REMOVE
A função JSON_REMOVE é compatível apenas com clusters cuja versão do kernel seja 3.1.10.0 ou posterior.
Para visualize e atualize a versão secundária, acesse a seção Configuration Information na página Cluster Information no console do AnalyticDB for MySQL.
json_remove(json,json_path)
json_remove(json,array[json_path,json_path,...])
Descrição: Remove o elemento no
json_pathespecificado de um documentojsone retorna a string modificada. Usearray[json_path,json_path,...]para especificar vários elementos para remoção.Tipo de valor de entrada:
jsoné uma string VARCHAR no formato JSON.json_pathé uma string VARCHAR no formato JSON.Tipo de valor de retorno: VARCHAR.
-
Exemplos
-
Remova o elemento no caminho
$.glossary.GlossDive obtenha a string modificada. Instrução:SELECT json_remove( '{ "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"] }, "GlossSee": "markup" } } } } }' , '$.glossary.GlossDiv') a;Resultado retornado:
{"glossary":{"title":"example glossary"}} -
Remova os elementos nos caminhos
$.glossary.titlee$.glossary.GlossDiv.titlee obtenha a string modificada. Instrução:SELECT json_remove( '{ "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"] }, "GlossSee": "markup" } } } } }' , array['$.glossary.title', '$.glossary.GlossDiv.title']) a;Resultado retornado:
{"glossary":{"GlossDiv":{"GlossList":{"GlossEntry":{"GlossTerm":"Standard Generalized Markup Language","GlossSee":"markup","SortAs":"SGML","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"ID":"SGML","Acronym":"SGML","Abbrev":"ISO 8879:1986"}}}}}
-
JSON_SIZE
json_size(json, json_path)
-
Descrição: Retorna o tamanho de um objeto ou array JSON no
json_pathespecificado.NotaSe
json_pathnão apontar para um objeto ou array JSON, esta função retorna0. Tipo de valor de entrada: String ou JSON.
Tipo de valor de retorno: BIGINT.
-
Exemplos:
-
json_pathaponta para um objeto JSON. Instrução:SELECT json_size('{"x":{"a":1, "b": 2}}', '$.x') as result;Resultado retornado:
+--------+ | result | +--------+ | 2 | +--------+ -
json_pathnão aponta para um objeto ou array JSON. Instrução:SELECT json_size('{"x": {"a": 1, "b": 2}}', '$.x.a') as result;Resultado retornado:
+--------+ | result | +--------+ | 0 | +--------+
-
JSON_SET
A função JSON_SET é compatível apenas com clusters cuja versão do kernel seja 3.2.2.8 ou posterior.
Para visualize e atualize a versão secundária, acesse a seção Configuration Information na página Cluster Information no console do AnalyticDB for MySQL.
json_set(json, json_path, value[, json_path, value] ...)
-
Descrição: Insere ou atualiza dados em um documento
jsonnojson_pathespecificado e retorna o documentojsonatualizado.Se
jsonoujson_pathfor nulo, a função retorna nulo.Se o documento
jsonnão estiver em um formato JSON válido, ou se algumjson_pathnão for uma expressão de caminho válida, uma exceção será lançada.Se o
json_pathespecificado existir, seu valor será sobrescrito porvalue.-
Se o
json_pathespecificado não existir no documentojson:Se
json_pathapontar para um objeto JSON,valueserá adicionado como um novo elemento na localização especificada porjson_path.Se
json_pathapontar para um array JSON, esta função verifica se existem dados na posição anterior aojson_pathespecificado. Se não houver dados, valoresnullserão adicionados para preencher a lacuna antes quevalueseja inserido. Caso contrário,valueserá inserido diretamente.Em outros casos, uma exceção será lançada.
-
Tipos de valores de entrada:
json: VARCHAR ou JSON.json_path: VARCHAR.value: BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, FLOAT, DOUBLE, DECIMAL, VARCHAR, VARBINARY, DATE, DATETIME, TIMESTAMP ou TIME.
Tipo de valor de retorno: JSON.
-
Exemplos:
-
Insira dados em um documento
jsonondejson_pathé nulo.SELECT JSON_SET('{ "a": 1, "b": [2, 3]}', null, '10');Resultado:
+------------------------------------------------+ | JSON_SET('{ "a": 1, "b": [2, 3]}', NULL, '10') | +------------------------------------------------+ | null | +------------------------------------------------+ -
Insira dados em um documento
jsonondejson_pathnão é uma expressão de caminho válida.SELECT JSON_SET('{ "a": 1, "b": [2, 3]}', '$.b.c', '10');Resultado:
Failed to execute json_set() for json_path: $.b.c -
Insira dados em um documento
jsonondejson_path1existe, ejson_path2não existe e aponta para um objeto JSON.SELECT JSON_SET('{ "a": 1, "b": [2, 3]}', '$.a', 10, '$.c', '[true, false]');Resultado:
+-----------------------------------------------------------------------+ | JSON_SET('{ "a": 1, "b": [2, 3]}', '$.a', 10, '$.c', '[true, false]') | +-----------------------------------------------------------------------+ | {"a":10,"b":[2,3],"c":"[true, false]"} | +-----------------------------------------------------------------------+ -
Insira dados em um documento
jsononde ojson_pathespecificado não existe e aponta para um array JSON.SELECT JSON_SET('{ "a": 1, "b": [2, 3]}', '$.b[4]', '[true, false]');Resultado:
+----------------------------------------------------------------+ | JSON_SET('{ "a": 1, "b": [2, 3]}', '$.b[4]', '[true, false]') | +----------------------------------------------------------------+ | {"a":1,"b":[2,3,null,null,"[true, false]"]} | +----------------------------------------------------------------+
-
JSON_UNQUOTE
json_unquote(json_value)
Esta função é compatível apenas com clusters cuja versão do kernel seja 3.1.5.0 ou posterior.
Para visualize e atualize a versão secundária, acesse a seção Configuration Information na página Cluster Information no console do AnalyticDB for MySQL.
-
Este comando remove as aspas duplas de
json_value, processa certos caracteres de escape e retorna o valor resultante.O AnalyticDB for MySQL não valida
json_value. Esta função processa o valor com base na lógica descrita, independentemente dejson_valueestar em conformidade com a sintaxe JSON.Os caracteres de escape suportados estão listados na tabela a seguir.
Antes de remover escape
Após remover escape
\"Aspas duplas (
").\bBackspace.
\fForm feed.
\nLine feed.
\rCarriage return.
\tTabulação.
\\Barra invertida (
\).\uXXXXRepresentação de caractere UTF-8.
Tipo de valor de entrada: VARCHAR.
Tipo de valor de retorno: VARCHAR.
-
Exemplos:
-
Obtenha a string sem aspas
abc. Instrução:SELECT json_unquote('"abc"');Resultado retornado:
+-----------------------+ | json_unquote('"abc"') | +-----------------------+ | abc | +-----------------------+ -
A seguinte instrução retorna a string sem aspas e analisada:
SELECT json_unquote('"\\t\\u0032"');Resultado:
+------------------------------+ | json_unquote('"\\t\\u0032"') | +------------------------------+ | 2 | +------------------------------+
-
Apêndice: Sintaxe de JSON Path
Uso
Use
$.keyName[.keyName]...para acessar uma chave específica em um objeto JSON.Use $[nonNegativeInteger] para acessar o enésimo elemento em um array JSON, onde n é um inteiro não negativo.
Use $.keyName[.keyName]...[nonNegativeInteger] para acessar o enésimo elemento de um array JSON aninhado em um objeto JSON, onde n é um inteiro não negativo.
Observações
A sintaxe JSON Path no AnalyticDB for MySQL não oferece suporte aos caracteres curinga * e **. Isso significa que expressões como '$.*', '$.hobbies[*]', '$.address.**' e '$.hobbies.**' não são suportadas.
Exemplos
Suponha que você tenha os seguintes dados JSON.
{
"name": "Alice",
"age": 25,
"address": {
"city": "Hangzhou",
"zip": "10001"
},
"hobbies":["reading", "swimming", "cycling"]
}
|
Descrição |
Exemplo correto |
Exemplo incorreto |
|
Acessar o valor da chave |
$.name |
name |
|
Acessar o valor da chave |
$.address.city |
$.address[0] |
|
Acessar o primeiro elemento do array JSON |
$.hobbies[0] |
$.hobbies.[0] |
Perguntas frequentes
Como resolver o erro java.lang.NullPointerException ao usar a função JSON_OVERLAPS?
Causa: Este erro ocorre se você usar uma instrução ALTER para criar um índice JSON, mas a operação BUILD não tiver sido executada ou ainda não estiver concluída. Nesse caso, o índice JSON não está ativo.
Solução:
-
Se a operação
BUILDnão tiver sido executada:Um cluster do AnalyticDB for MySQL aciona automaticamente uma tarefa `BUILD` quando certas condições são atendidas. Você também pode acionar manualmente uma tarefa `BUILD`.
-
Se a operação
BUILDtiver sido executada:Execute a seguinte instrução para consultar o status da tarefa
BUILD. Se o campostatusno resultado retornado forFINISH, a operaçãoBUILDestará concluída.SELECT table_name, schema_name, status FROM INFORMATION_SCHEMA.KEPLER_META_BUILD_TASK ORDER BY create_time DESC LIMIT 10;
Para obter mais informações sobre BUILD, consulte BUILD.
Referências
JSON: Descreve o tipo de dado JSON.
Índices JSON: Descreve como criar índices para objetos e arrays JSON.