PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Thu thập các khóa JSON đệ quy trong Postgres

Mẹo là thêm một số thử nghiệm điều kiện cuối cùng bằng cách sử dụng json_typeof ở đúng nơi.

Bạn cũng nên sử dụng jsonb nếu bạn không quan tâm đến thứ tự khóa đối tượng.

Đây là môi trường làm việc của tôi:

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
    }
  }
 }
}');

Đệ quy bị dừng khi truy vấn thứ hai không trả về bất kỳ hàng nào. Điều này được thực hiện bằng cách chuyển một đối tượng trống đến 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. Tại sao tôi không thể sử dụng bí danh cột trong biểu thức SELECT tiếp theo?

  2. Các thủ tục được lưu trữ có chạy trong giao dịch cơ sở dữ liệu trong Postgres không?

  3. postgreSQL - trong so với bất kỳ

  4. Cách tốt nhất để kiểm tra giá trị trống hoặc rỗng

  5. LỖI:quyền bị từ chối đối với tên bảng quan hệ trên Postgres trong khi thử SELECT với tư cách người dùng chỉ đọc