No banco de dados Oracle, o
JSON_TABLE() A função cria uma visualização relacional de dados JSON. Ele permite que você apresente os valores em um documento JSON em formato de tabela – como linhas e colunas. Sintaxe
A sintaxe fica assim:
JSON_TABLE
( expr [ FORMAT JSON ] [ , JSON_basic_path_expression ]
[ JSON_table_on_error_clause ] [ JSON_table_on_empty_clause ]
JSON_columns_clause ) Onde:
expré o documento JSON que você deseja consultarJSON_basic_path_expressioné a expressão de caminho SQL/JSON.JSON_query_on_error_clauseespecifica o valor retornado quando ocorrem determinados erros.JSON_query_on_empty_clauseespecifica o valor retornado se nenhuma correspondência for encontrada.JSON_columns_clausedefine as colunas na tabela relacional virtual retornada pela função.
O
JSON_TABLE() A função só pode ser usada no FROM cláusula de um SELECT demonstração. Exemplo
Veja um exemplo para demonstrar como funciona:
SELECT *
FROM JSON_TABLE('{a:1, b:2, c:3}', '$' COLUMNS(a, b, c)); Resultado:
A B C ____ ____ ____ 1 2 3
Aqui está com um pouco mais de dados:
SELECT *
FROM JSON_TABLE(
'[{a:1, b:2, c:3}, {a:4, b:5, c:6}, {a:7, b:8, c:9}]',
'$[*]'
COLUMNS(a, b, c)
); Resultado:
A B C ____ ____ ____ 1 2 3 4 5 6 7 8 9
Menos colunas
Veja o que acontece se reduzirmos o número de colunas especificadas no
COLUMNS cláusula:SELECT *
FROM JSON_TABLE(
'[{a:1, b:2, c:3}, {a:4, b:5, c:6}, {a:7, b:8, c:9}]',
'$[*]'
COLUMNS(a, b)
); Resultado:
A B ____ ____ 1 2 4 5 7 8
Podemos obter o mesmo resultado especificando as colunas selecionadas no
SELECT Lista:SELECT a, b
FROM JSON_TABLE(
'[{a:1, b:2, c:3}, {a:4, b:5, c:6}, {a:7, b:8, c:9}]',
'$[*]'
COLUMNS(a, b, c)
); Resultado:
A B ____ ____ 1 2 4 5 7 8
Selecione linhas específicas
Podemos usar cláusulas como
WHERE para selecionar apenas as linhas que atendem a determinados critérios:SELECT *
FROM JSON_TABLE(
'[{a:1, b:2, c:3}, {a:4, b:5, c:6}, {a:7, b:8, c:9}]',
'$[*]'
COLUMNS(a, b, c)
)
WHERE b = 5; Resultado:
A B C ____ ____ ____ 4 5 6
Tratamento de erros
Podemos usar as seguintes cláusulas para lidar com erros:
NULL ON ERROR- Se a entrada não for um JSON bem formado, nenhuma linha será retornada a partir do ponto em que o erro foi detectado.
- Se nenhuma correspondência for encontrada quando a expressão de caminho de linha for avaliada, nenhuma linha será retornada.
- Define o comportamento de erro padrão para todas as expressões de coluna como
NULL ON ERROR
ERROR ON ERROR- Se a entrada não for um JSON bem formado, um erro será gerado.
- Se nenhuma correspondência for encontrada quando a expressão de caminho de linha for avaliada, um erro será gerado
- Define o comportamento de erro padrão para todas as expressões de coluna como
ERROR ON ERROR
Aqui está um exemplo de
NULL ON ERROR :SELECT *
FROM JSON_TABLE(
'[{a:1, b:2, c:3}, {a:4, b:5, c:6}, a:7, b:8, c:9]',
'$[*]'
NULL ON ERROR
COLUMNS(a, b, c)
); Resultado:
A B C ____ ____ ____ 1 2 3 4 5 6
Como o
JSON_TABLE() função suporta avaliação de streaming, as linhas podem ser retornadas antes de encontrar a parte da entrada com o erro. Isso é exatamente o que podemos ver com este exemplo - temos as duas primeiras linhas, mas não a terceira (devido a essa parte do JSON não ser um JSON bem formado). Aqui está com o
ERROR ON ERROR cláusula:SELECT *
FROM JSON_TABLE(
'[{a:1, b:2, c:3}, {a:4, b:5, c:6}, a:7, b:8, c:9]',
'$[*]'
ERROR ON ERROR
COLUMNS(a, b, c)
); Resultado:
Error report - ORA-40441: JSON syntax error
Gerenciando resultados vazios
Você também pode usar uma cláusula para especificar o valor retornado se nenhuma correspondência for encontrada. Esta cláusula permite especificar um resultado diferente para esse tipo de erro do que o resultado especificado com as cláusulas de erro.
Essas cláusulas são:
NULLONEMPTY– Retorna null quando nenhuma correspondência é encontrada.ERRORONEMPTY– Retorna o erro apropriado do Oracle quando nenhuma correspondência é encontrada.DEFAULTliteralONEMPTY– Retornaliteralquando nenhuma correspondência for encontrada. O tipo de dados deliteraldeve corresponder ao tipo de dados do valor retornado por esta função.
Consulte a documentação do Oracle para obter mais informações sobre o
JSON_TABLE() função.