Oracle
 sql >> Base de données >  >> RDS >> Oracle

Fonction JSON_TABLE() dans Oracle

Dans Oracle Database, le JSON_TABLE() La fonction crée une vue relationnelle des données JSON. Il vous permet de présenter les valeurs d'un document JSON sous forme de tableau - sous forme de lignes et de colonnes.

Syntaxe

La syntaxe ressemble à ceci :

JSON_TABLE
  ( expr [ FORMAT JSON ] [ , JSON_basic_path_expression ]
    [ JSON_table_on_error_clause ] [ JSON_table_on_empty_clause ] 
    JSON_columns_clause )

Où :

  • expr est le document JSON que vous souhaitez interroger
  • JSON_basic_path_expression est l'expression de chemin SQL/JSON.
  • JSON_query_on_error_clause spécifie la valeur renvoyée lorsque certaines erreurs se produisent.
  • JSON_query_on_empty_clause spécifie la valeur renvoyée si aucune correspondance n'est trouvée.
  • JSON_columns_clause définit les colonnes de la table relationnelle virtuelle renvoyée par la fonction.

Le JSON_TABLE() la fonction ne peut être utilisée que dans le FROM clause d'un SELECT déclaration.

Exemple

Voici un exemple pour illustrer son fonctionnement :

SELECT *
FROM JSON_TABLE('{a:1, b:2, c:3}', '$' COLUMNS(a, b, c));

Résultat :

   A    B    C 
____ ____ ____ 
1    2    3    

La voici avec un peu plus de données :

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)
    );

Résultat :

   A    B    C 
____ ____ ____ 
1    2    3    
4    5    6    
7    8    9   

Moins de colonnes

Voici ce qui se passe si nous réduisons le nombre de colonnes spécifiées dans le COLUMNS clause :

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)
    );

Résultat :

   A    B 
____ ____ 
1    2    
4    5    
7    8    

Nous pouvons obtenir le même résultat en spécifiant les colonnes sélectionnées dans le SELECT liste :

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)
    );

Résultat :

   A    B 
____ ____ 
1    2    
4    5    
7    8    

Sélectionner des lignes spécifiques

Nous pouvons utiliser des clauses comme WHERE pour ne sélectionner que les lignes qui satisfont à certains critères :

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;

Résultat :

   A    B    C 
____ ____ ____ 
4    5    6    

Gestion des erreurs

Nous pouvons utiliser les clauses suivantes pour traiter les erreurs :

  • NULL ON ERROR
    • Si l'entrée n'est pas un JSON bien formé, aucune autre ligne n'est renvoyée à partir du moment où l'erreur est détectée.
    • Si aucune correspondance n'est trouvée lors de l'évaluation de l'expression de chemin de ligne, aucune ligne n'est renvoyée.
    • Définit le comportement d'erreur par défaut pour toutes les expressions de colonne sur NULL ON ERROR
  • ERROR ON ERROR
    • Si l'entrée n'est pas un JSON bien formé, une erreur est générée.
    • Si aucune correspondance n'est trouvée lors de l'évaluation de l'expression de chemin de ligne, une erreur sera générée
    • Définit le comportement d'erreur par défaut pour toutes les expressions de colonne sur ERROR ON ERROR

Voici un exemple 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)
    );

Résultat :

   A    B    C 
____ ____ ____ 
1    2    3    
4    5    6    

Depuis le JSON_TABLE() prend en charge l'évaluation en continu, les lignes peuvent être renvoyées avant de rencontrer la partie de l'entrée avec l'erreur. C'est exactement ce que nous pouvons voir avec cet exemple - nous avons les deux premières lignes, mais pas la troisième (car cette partie du JSON n'est pas bien formée).

Le voici avec le ERROR ON ERROR clause :

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)
    );

Résultat :

Error report -
ORA-40441: JSON syntax error

Gestion des résultats vides

Vous pouvez également utiliser une clause pour spécifier la valeur renvoyée si aucune correspondance n'est trouvée. Cette clause vous permet de spécifier un résultat différent pour ce type d'erreur que le résultat spécifié avec les clauses d'erreur.

Ces clauses sont :

  • NULL ON EMPTY – Renvoie null lorsqu'aucune correspondance n'est trouvée.
  • ERROR ON EMPTY – Renvoie l'erreur Oracle appropriée lorsqu'aucune correspondance n'est trouvée.
  • DEFAULT literal ON EMPTY – Renvoie literal lorsqu'aucune correspondance n'est trouvée. Le type de données de literal doit correspondre au type de données de la valeur renvoyée par cette fonction.

Voir la documentation Oracle pour plus d'informations sur le JSON_TABLE() fonction.