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

Oracle18のjson_tableを介してjsonを解析します

    関数を定義できます:

    CREATE FUNCTION get_keys(
      value IN CLOB
    ) RETURN SYS.ODCIVARCHAR2LIST PIPELINED
    IS
      js   JSON_OBJECT_T := JSON_OBJECT_T( value );
      keys JSON_KEY_LIST;
    BEGIN
      keys := js.get_keys();
      FOR i in 1 .. keys.COUNT LOOP
        PIPE ROW ( keys(i) );
      END LOOP;
    END;
    /
    
    CREATE FUNCTION get_value(
      value IN CLOB,
      path  IN VARCHAR2
    ) RETURN VARCHAR2
    IS
      js JSON_OBJECT_T := JSON_OBJECT_T( value );
    BEGIN
      RETURN js.get_string( path );
    END;
    /
    

    次に、クエリを使用します:

    WITH j (sJson) as (
       select '{
          "ID":"1444284517",
          "ID_ORD":"4255;2187606199",
          "Vals":{
                   "CODE":"ONB2B3BB8",
                   "DORD":"25.04.2021"
                 }
       }'
       from dual
    )
    SELECT jt.id,
           jt.id_ord,
           k.COLUMN_VALUE AS Key,
           get_value( jt.vals, k.COLUMN_VALUE ) AS value
    FROM   j
           CROSS APPLY JSON_TABLE(
             j.sjson,
             '$'
             COLUMNS (
               id     VARCHAR2(20) PATH '$.ID',
               id_ord VARCHAR2(30) PATH '$.ID_ORD',
               vals   VARCHAR2(4000) FORMAT JSON PATH '$.Vals'
             )
           ) jt
           CROSS APPLY get_keys( jt.vals ) k
    

    どの出力:

    ID ID_ORD キー 値 14442845174255; 2187606199CODEONB2B3BB814442845174255; 2187606199DORD25.04.2021

    (注:SQLは動的な数の列をサポートしていないため、keyなどの固定数の列を指定する必要があります およびvalue 出力は列ではなく行になります。)

    db<>ここでフィドル



    1. SQLデータベース管理者インタビューのヒント

    2. Apache Sparkに火をつける–パート2

    3. SQLDeveloperに新しい接続を追加するときにOracleTNS名が表示されない

    4. クエリプラン全体のパフォーマンスチューニング