चाल 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_recursive
WHERE json_typeof(doc_key_and_value_recursive.value) <> 'object';