诀窍是
json_typeof在正确的位置添加一些最终条件测试。
jsonb如果您不关心对象键顺序,也应该使用。
这是我的工作环境:
CREATE TABLE test ( id SERIAL PRIMARY KEY, doc JSON);INSERT INTO test (doc) VALUES ('{ "files": { "folder": { "file1": { "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 } } }}');当第二个查询不返回任何行时,递归将停止。这是通过将空对象传递到来完成的
json_each。
WITH 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_each(CASE WHEN json_typeof(doc_key_and_value_recursive.value) <> 'object' THEN '{}' :: JSON ELSE doc_key_and_value_recursive.value END) AS t)SELECt *FROM doc_key_and_value_recursiveWHERe json_typeof(doc_key_and_value_recursive.value) <> 'object';


