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ågaJSON_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
– Returnerarliteral
när ingen matchning hittas. Datatypen förliteral
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.