Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Função JSON_TABLE() no Oracle


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 consultar
  • JSON_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 – Retorna literal quando nenhuma correspondência for encontrada. O tipo de dados de literal 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.