Zum Inhalt springen

SQL nach/von JSON

DuckDB bietet Funktionen, um SELECT-Anweisungen zwischen SQL und JSON zu serialisieren und zu deserialisieren sowie serialisierte JSON-Anweisungen auszuführen.

Funktion Typ Beschreibung
json_deserialize_sql(json) Skalar Deserialisiert eine oder mehrere als json serialisierte Anweisungen zurück in eine gleichwertige SQL-Zeichenkette.
json_execute_serialized_sql(varchar) Tabelle Führt als json serialisierte Anweisungen aus und gibt die resultierenden Zeilen zurück. Derzeit wird nur eine Anweisung gleichzeitig unterstützt.
json_serialize_sql(varchar, skip_default := boolean, skip_empty := boolean, skip_null := boolean, format := boolean) Skalar Serialisiert eine Menge durch Semikolon (;) getrennter SELECT-Anweisungen in eine gleichwertige Liste als json serialisierter Anweisungen.
PRAGMA json_execute_serialized_sql(varchar) Pragma PRAGMA-Variante der Funktion json_execute_serialized_sql.

Die Funktion json_serialize_sql(varchar) nimmt drei optionale Parameter entgegen, skip_empty, skip_null und format, mit denen die Ausgabe der serialisierten Anweisungen gesteuert werden kann.

Wenn Sie die Tabellenfunktion json_execute_serialized_sql(varchar) innerhalb einer Transaktion ausführen, können die serialisierten Anweisungen keine transaktionslokalen Änderungen sehen. Das liegt daran, dass die Anweisungen in einem eigenen Abfragekontext ausgeführt werden. Sie können die PRAGMA-Variante PRAGMA json_execute_serialized_sql(varchar) verwenden, um die Anweisungen im selben Abfragekontext wie das PRAGMA auszuführen, mit der Einschränkung, dass das serialisierte JSON als konstante Zeichenkette übergeben werden muss, d. h. PRAGMA json_execute_serialized_sql(json_serialize_sql(...)) ist nicht möglich.

Beachten Sie, dass diese Funktionen syntaktischen Zucker wie FROM * SELECT ... nicht erhalten. Eine Anweisung, die den Roundtrip json_deserialize_sql(json_serialize_sql(...)) durchläuft, ist daher möglicherweise nicht identisch mit der ursprünglichen Anweisung, sollte aber immer semantisch gleichwertig sein und dasselbe Ergebnis liefern.

Beispiele

Einfaches Beispiel:

SELECT json_serialize_sql('SELECT 2');
{"error":false,"statements":[{"node":{"type":"SELECT_NODE","modifiers":[],"cte_map":{"map":[]},"select_list":[{"class":"CONSTANT","type":"VALUE_CONSTANT","alias":"","query_location":7,"value":{"type":{"id":"INTEGER","type_info":null},"is_null":false,"value":2}}],"from_table":{"type":"EMPTY","alias":"","sample":null,"query_location":18446744073709551615},"where_clause":null,"group_expressions":[],"group_sets":[],"aggregate_handling":"STANDARD_HANDLING","having":null,"sample":null,"qualify":null},"named_param_map":[]}]}

Beispiel mit mehreren Anweisungen und Skip-Optionen:

SELECT json_serialize_sql('SELECT 1 + 2; SELECT a + b FROM tbl1', skip_empty := true, skip_null := true);
{"error":false,"statements":[{"node":{"type":"SELECT_NODE","select_list":[{"class":"FUNCTION","type":"FUNCTION","query_location":9,"function_name":"+","children":[{"class":"CONSTANT","type":"VALUE_CONSTANT","query_location":7,"value":{"type":{"id":"INTEGER"},"is_null":false,"value":1}},{"class":"CONSTANT","type":"VALUE_CONSTANT","query_location":11,"value":{"type":{"id":"INTEGER"},"is_null":false,"value":2}}],"order_bys":{"type":"ORDER_MODIFIER"},"distinct":false,"is_operator":true,"export_state":false}],"from_table":{"type":"EMPTY","query_location":18446744073709551615},"aggregate_handling":"STANDARD_HANDLING"}},{"node":{"type":"SELECT_NODE","select_list":[{"class":"FUNCTION","type":"FUNCTION","query_location":23,"function_name":"+","children":[{"class":"COLUMN_REF","type":"COLUMN_REF","query_location":21,"column_names":["a"]},{"class":"COLUMN_REF","type":"COLUMN_REF","query_location":25,"column_names":["b"]}],"order_bys":{"type":"ORDER_MODIFIER"},"distinct":false,"is_operator":true,"export_state":false}],"from_table":{"type":"BASE_TABLE","query_location":32,"table_name":"tbl1"},"aggregate_handling":"STANDARD_HANDLING"}}]}

Standardwerte im AST überspringen (z. B. "distinct":false):

SELECT json_serialize_sql('SELECT 1 + 2; SELECT a + b FROM tbl1', skip_default := true, skip_empty := true, skip_null := true);
{"error":false,"statements":[{"node":{"type":"SELECT_NODE","select_list":[{"class":"FUNCTION","type":"FUNCTION","query_location":9,"function_name":"+","children":[{"class":"CONSTANT","type":"VALUE_CONSTANT","query_location":7,"value":{"type":{"id":"INTEGER"},"is_null":false,"value":1}},{"class":"CONSTANT","type":"VALUE_CONSTANT","query_location":11,"value":{"type":{"id":"INTEGER"},"is_null":false,"value":2}}],"order_bys":{"type":"ORDER_MODIFIER"},"is_operator":true}],"from_table":{"type":"EMPTY"},"aggregate_handling":"STANDARD_HANDLING"}},{"node":{"type":"SELECT_NODE","select_list":[{"class":"FUNCTION","type":"FUNCTION","query_location":23,"function_name":"+","children":[{"class":"COLUMN_REF","type":"COLUMN_REF","query_location":21,"column_names":["a"]},{"class":"COLUMN_REF","type":"COLUMN_REF","query_location":25,"column_names":["b"]}],"order_bys":{"type":"ORDER_MODIFIER"},"is_operator":true}],"from_table":{"type":"BASE_TABLE","query_location":32,"table_name":"tbl1"},"aggregate_handling":"STANDARD_HANDLING"}}]}

Beispiel mit Syntaxfehler:

SELECT json_serialize_sql('TOTALLY NOT VALID SQL');
{"error":true,"error_type":"parser","error_message":"syntax error at or near \"TOTALLY\"","error_subtype":"SYNTAX_ERROR","position":"0"}

Beispiel mit Deserialisierung:

SELECT json_deserialize_sql(json_serialize_sql('SELECT 1 + 2'));
SELECT (1 + 2)

Beispiel mit Deserialisierung und syntaktischem Zucker, der bei der Transformation verloren geht:

SELECT json_deserialize_sql(json_serialize_sql('FROM x SELECT 1 + 2'));
SELECT (1 + 2) FROM x

Beispiel mit Ausführung:

SELECT * FROM json_execute_serialized_sql(json_serialize_sql('SELECT 1 + 2'));
3

Beispiel mit Fehler:

SELECT * FROM json_execute_serialized_sql(json_serialize_sql('TOTALLY NOT VALID SQL'));
Terminal window
Parser Error:
Error parsing json: parser: syntax error at or near "TOTALLY"