sql >> Database teknologi >  >> RDS >> PostgreSQL

Saml rekursive JSON-nøgler i Postgres

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;

  1. MySQL Tutorial – Konfiguration og administration af SSL på din MySQL-server

  2. Slut dig til 3 tabeller i SQL

  3. Split funktion i SQL Server 2008

  4. Hvad er forskellen mellem RANK og DENSE_RANK i SQL?