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_clause
especifica o valor retornado quando ocorrem determinados erros.JSON_query_on_empty_clause
especifica o valor retornado se nenhuma correspondência for encontrada.JSON_columns_clause
define 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:
NULL
ON
EMPTY
– Retorna null quando nenhuma correspondência é encontrada.ERROR
ON
EMPTY
– Retorna o erro apropriado do Oracle quando nenhuma correspondência é encontrada.DEFAULT
literal
ON
EMPTY
– Retornaliteral
quando nenhuma correspondência for encontrada. O tipo de dados deliteral
deve 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.