PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Събирайте рекурсивни JSON ключове в Postgres

Номерът е да добавите някои крайни тестове на условия с помощта на 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';


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как Mod() работи в PostgreSQL

  2. Как да защитите вашите PostgreSQL бази данни от кибератаки с SQL защитна стена

  3. Еквивалент на PostgreSQL GROUP_CONCAT().

  4. Как to_timestamp() работи в PostgreSQL

  5. Тенденции в PostgreSQL:Най-популярните облачни доставчици, езици, VACUUM, стратегии за управление на заявки и типове внедряване в предприятието