sql >> Database teknologi >  >> RDS >> Oracle

JSON_TABLE() Funktion i Oracle

I Oracle Database er JSON_TABLE() funktion opretter en relationel visning af JSON-data. Det giver dig mulighed for at præsentere værdierne i et JSON-dokument i tabelformat – som rækker og kolonner.

Syntaks

Syntaksen ser sådan ud:

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

Hvor:

  • expr er det JSON-dokument, du vil forespørge på
  • JSON_basic_path_expression er SQL/JSON-stiudtrykket.
  • JSON_query_on_error_clause angiver den værdi, der returneres, når visse fejl opstår.
  • JSON_query_on_empty_clause angiver den værdi, der returneres, hvis der ikke findes noget match.
  • JSON_columns_clause definerer kolonnerne i den virtuelle relationstabel, der returneres af funktionen.

JSON_TABLE() funktionen kan kun bruges i FROM klausul af en SELECT erklæring.

Eksempel

Her er et eksempel for at demonstrere, hvordan det virker:

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

Resultat:

   A    B    C 
____ ____ ____ 
1    2    3    

Her er den med lidt flere 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 kolonner

Her er, hvad der sker, hvis vi reducerer antallet af kolonner, der er angivet 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 opnå det samme resultat ved at angive udvalgte kolonner i 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)
    );

Resultat:

   A    B 
____ ____ 
1    2    
4    5    
7    8    

Vælg specifikke rækker

Vi kan bruge klausuler som WHERE for kun at vælge de rækker, der opfylder et bestemt 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    

Fejlhåndtering

Vi kan bruge følgende klausuler til at håndtere fejl:

  • NULL ON ERROR
    • Hvis input ikke er veludformet JSON, returneres der ikke flere rækker fra det punkt, hvor fejlen er opdaget.
    • Hvis der ikke findes noget match, når rækkestiudtrykket evalueres, returneres ingen rækker.
    • Indstiller standardfejladfærden for alle kolonneudtryk til NULL ON ERROR
  • ERROR ON ERROR
    • Hvis input ikke er veludformet JSON, opstår der en fejl.
    • Hvis der ikke findes noget match, når rækkestiudtrykket evalueres, vil der blive rejst en fejl
    • Indstiller standardfejladfærden for alle kolonneudtryk til ERROR ON ERROR

Her er et eksempel 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    

Siden JSON_TABLE() funktionen understøtter streamingevaluering, rækker kan returneres, før de støder på den del af inputtet med fejlen. Det er præcis, hvad vi kan se med dette eksempel – vi fik de to første rækker, men ikke den tredje (på grund af den del af JSON, der ikke er veludformet JSON).

Her er 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

Håndtering af tomme resultater

Du kan også bruge en klausul til at angive den returnerede værdi, hvis der ikke findes noget match. Denne klausul giver dig mulighed for at angive et andet udfald for denne type fejl end det resultat, der er angivet med fejlklausulerne.

Disse klausuler er:

  • NULL ON EMPTY – Returnerer null, når der ikke findes noget match.
  • ERROR ON EMPTY – Returnerer den relevante Oracle-fejl, når der ikke findes noget match.
  • DEFAULT literal ON EMPTY – Returnerer literal når der ikke findes noget match. Datatypen literal skal matche datatypen for den værdi, der returneres af denne funktion.

Se Oracle-dokumentationen for at få flere oplysninger om JSON_TABLE() funktion.


  1. Er der et alvorligt præstationshit for at bruge udenlandske nøgler i SQL Server?

  2. Skal jeg oprette en klasse, der arver SQLiteOpenHelper for hver tabel i min database?

  3. SQL Server-historiktabel - udfyldes via SP eller Trigger?

  4. Udforsk de forskellige måder at kryptere dine MariaDB-data på