Tricket er at tilføje nogle endelige tilstandstest ved hjælp af json_typeof
på det rigtige sted.
Du bør også bruge jsonb
hvis du er ligeglad med objektets nøglerækkefølge.
Her er mit arbejdsmiljø:
CREATE TABLE test (id SERIEPRIMÆR NØGLE, doc JSON);INSERT INTO test (doc) VALUES ('{ "filer":{ "mappe":{ "fil1":{ "property":"blah " }, "file2":{ "property":"blah" }, "file3":{ "property":"blah" }, "file4":{ "property":"blah", "prop" :{ " clap":"clap" } } }},"software":{ "apt":{ "package1":{ "version":1.2 }, "package2":{ "version":1.2 }, "package3":{ "version":1.2 }, "package4":{ "version":1.2 } } }}');
Rekursionen stoppes, når den anden forespørgsel ikke returnerer nogen rækker. Dette gøres ved at sende et tomt objekt til json_each
.
MED RECURSIVE doc_key_and_value_recursive(key, value) AS ( SELECT t.key, t.value FROM test, json_each(test.doc) AS t UNION ALL SELECT t.key, t.value FROM doc_key_and_value_recursive(json_ TILFÆLDE, NÅR json_typeof(doc_key_and_value_recursive.value) <> 'object' SÅ '{}' ::JSON ELSE doc_key_and_value_recursive.value END) AS t)VÆLG *FRA doc_key_and_value_recursiveWHERE json_key_typeof_value;