sql >> Databasteknik >  >> RDS >> Oracle

JSON_TABLE() Funktion i Oracle

I Oracle Database, JSON_TABLE() funktionen skapar en relationsvy av JSON-data. Det låter dig presentera värdena i ett JSON-dokument i tabellformat – som rader och kolumner.

Syntax

Syntaxen ser ut så här:

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

Var:

  • expr är JSON-dokumentet du vill fråga
  • JSON_basic_path_expression är SQL/JSON-sökvägsuttrycket.
  • JSON_query_on_error_clause anger värdet som returneras när vissa fel uppstår.
  • JSON_query_on_empty_clause anger värdet som returneras om ingen matchning hittas.
  • JSON_columns_clause definierar kolumnerna i den virtuella relationstabellen som returneras av funktionen.

JSON_TABLE() funktionen kan endast användas i FROM sats av en SELECT uttalande.

Exempel

Här är ett exempel för att visa hur det fungerar:

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

Resultat:

   A    B    C 
____ ____ ____ 
1    2    3    

Här är den med lite mer data:

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

Resultat:

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

Färre kolumner

Här är vad som händer om vi minskar antalet kolumner som anges i COLUMNS klausul:

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

Resultat:

   A    B 
____ ____ 
1    2    
4    5    
7    8    

Vi kan uppnå samma resultat genom att ange valda kolumner i 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)
    );

Resultat:

   A    B 
____ ____ 
1    2    
4    5    
7    8    

Välj specifika rader

Vi kan använda satser som WHERE för att bara välja de rader som uppfyller ett visst kriterium:

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;

Resultat:

   A    B    C 
____ ____ ____ 
4    5    6    

Felhantering

Vi kan använda följande klausuler för att hantera fel:

  • NULL ON ERROR
    • Om indata inte är välformaterad JSON, returneras inga fler rader från den punkt där felet upptäcktes.
    • Om ingen matchning hittas när radvägsuttrycket utvärderas, returneras inga rader.
    • Ställer in standardfelbeteendet för alla kolumnuttryck till NULL ON ERROR
  • ERROR ON ERROR
    • Om indata inte är välformaterad JSON, uppstår ett fel.
    • Om ingen matchning hittas när radvägsuttrycket utvärderas, kommer ett fel att visas
    • Ställer in standardfelbeteendet för alla kolumnuttryck till ERROR ON ERROR

Här är ett exempel på 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)
    );

Resultat:

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

Sedan JSON_TABLE() funktionen stöder strömningsutvärdering, rader kan returneras innan de stöter på den del av ingången med felet. Det är precis vad vi kan se med det här exemplet – vi fick de två första raden, men inte den tredje (på grund av att den delen av JSON inte är välformad JSON).

Här är den med ERROR ON ERROR klausul:

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

Resultat:

Error report -
ORA-40441: JSON syntax error

Hantera tomma resultat

Du kan också använda en sats för att ange värdet som returneras om ingen matchning hittas. Den här klausulen låter dig ange ett annat utfall för den här typen av fel än det utfall som anges med felklausulerna.

Dessa klausuler är:

  • NULL ON EMPTY – Returnerar null när ingen matchning hittas.
  • ERROR ON EMPTY – Returnerar lämpligt Oracle-fel när ingen matchning hittas.
  • DEFAULT literal ON EMPTY – Returnerar literal när ingen matchning hittas. Datatypen för literal måste matcha datatypen för värdet som returneras av den här funktionen.

Se Oracle-dokumentationen för mer information om JSON_TABLE() funktion.


  1. Dynamiskt svänga ett bord Oracle

  2. Hitta orsaken till dödlägesfel från oracle trace-fil

  3. Hur man använder samma schema för flera SQL Server-agentjobb (T-SQL)

  4. Få MySQL-databasutdata via PHP till XML