sql >> データベース >  >> RDS >> PostgreSQL

Postgresで再帰的なJSONキーを収集する

    秘訣は、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
        }
      }
     }
    }');
    

    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. OraOLEDB.Oracleプロバイダーがローカルマシンに登録されていません

    2. oracle12c-文字が最後に出現した後の文字列を選択します

    3. データベースに直接アクセスするための開発者ツール

    4. ロックとパフォーマンス