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 xBeispiel mit Ausführung:
SELECT * FROM json_execute_serialized_sql(json_serialize_sql('SELECT 1 + 2'));3Beispiel mit Fehler:
SELECT * FROM json_execute_serialized_sql(json_serialize_sql('TOTALLY NOT VALID SQL'));Parser Error:Error parsing json: parser: syntax error at or near "TOTALLY"