In Oracle Database, de JSON_TABLE()
functie maakt een relationele weergave van JSON-gegevens. Hiermee kunt u de waarden in een JSON-document in tabelformaat presenteren - als rijen en kolommen.
Syntaxis
De syntaxis gaat als volgt:
JSON_TABLE
( expr [ FORMAT JSON ] [ , JSON_basic_path_expression ]
[ JSON_table_on_error_clause ] [ JSON_table_on_empty_clause ]
JSON_columns_clause )
Waar:
expr
is het JSON-document dat u wilt opvragenJSON_basic_path_expression
is de SQL/JSON-padexpressie.JSON_query_on_error_clause
specificeert de waarde die wordt geretourneerd wanneer bepaalde fouten optreden.JSON_query_on_empty_clause
specificeert de waarde die wordt geretourneerd als er geen overeenkomst wordt gevonden.JSON_columns_clause
definieert de kolommen in de virtuele relationele tabel die door de functie wordt geretourneerd.
De JSON_TABLE()
functie kan alleen worden gebruikt in de FROM
clausule van een SELECT
verklaring.
Voorbeeld
Hier is een voorbeeld om te laten zien hoe het werkt:
SELECT *
FROM JSON_TABLE('{a:1, b:2, c:3}', '$' COLUMNS(a, b, c));
Resultaat:
A B C ____ ____ ____ 1 2 3
Hier is het met iets meer gegevens:
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)
);
Resultaat:
A B C ____ ____ ____ 1 2 3 4 5 6 7 8 9
Minder kolommen
Dit is wat er gebeurt als we het aantal kolommen verminderen dat is gespecificeerd in de COLUMNS
clausule:
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)
);
Resultaat:
A B ____ ____ 1 2 4 5 7 8
We kunnen hetzelfde resultaat bereiken door geselecteerde kolommen op te geven in de SELECT
lijst:
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)
);
Resultaat:
A B ____ ____ 1 2 4 5 7 8
Selecteer specifieke rijen
We kunnen clausules gebruiken zoals WHERE
om alleen die rijen te selecteren die aan bepaalde criteria voldoen:
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;
Resultaat:
A B C ____ ____ ____ 4 5 6
Foutafhandeling
We kunnen de volgende clausules gebruiken om met fouten om te gaan:
NULL ON ERROR
- Als de invoer geen goed gevormde JSON is, worden er geen rijen meer geretourneerd vanaf het punt waarop de fout is gedetecteerd.
- Als er geen overeenkomst wordt gevonden wanneer de rijpadexpressie wordt geëvalueerd, worden er geen rijen geretourneerd.
- Stelt het standaard foutgedrag voor alle kolomuitdrukkingen in op
NULL ON ERROR
ERROR ON ERROR
- Als de invoer geen goed gevormde JSON is, wordt er een fout gegenereerd.
- Als er geen overeenkomst wordt gevonden wanneer de rijpadexpressie wordt geëvalueerd, wordt er een fout gegenereerd
- Stelt het standaard foutgedrag voor alle kolomuitdrukkingen in op
ERROR ON ERROR
Hier is een voorbeeld van 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)
);
Resultaat:
A B C ____ ____ ____ 1 2 3 4 5 6
Sinds de JSON_TABLE()
functie ondersteunt streaming-evaluatie, rijen kunnen worden geretourneerd voordat het gedeelte van de invoer met de fout wordt aangetroffen. Dat is precies wat we in dit voorbeeld kunnen zien - we hebben de eerste twee rijen, maar niet de derde (omdat dat deel van de JSON geen goed gevormde JSON is).
Hier is het met de ERROR ON ERROR
clausule:
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)
);
Resultaat:
Error report - ORA-40441: JSON syntax error
Lege resultaten afhandelen
U kunt ook een clausule gebruiken om de waarde op te geven die wordt geretourneerd als er geen overeenkomst wordt gevonden. Met deze clausule kunt u een andere uitkomst voor dit type fout specificeren dan de uitkomst die is gespecificeerd met de foutclausules.
Deze clausules zijn:
NULL
ON
EMPTY
– Retourneert null wanneer er geen overeenkomst is gevonden.ERROR
ON
EMPTY
– Retourneert de juiste Oracle-fout wanneer er geen overeenkomst wordt gevonden.DEFAULT
literal
ON
EMPTY
– Retourneertliteral
wanneer er geen match wordt gevonden. Het gegevenstypeliteral
moet overeenkomen met het gegevenstype van de waarde die door deze functie wordt geretourneerd.
Zie de Oracle-documentatie voor meer informatie over de JSON_TABLE()
functie.