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

OracleSQLを使用してJsonを解析する-JSON_TABLE

    配列値の相互結合(rownumでグループ化)が必要なようです およびname )。これは標準のJSON構造ではないため、json_tableの単一のアプリケーションでこれを実行できると期待すべきではありません。 。

    json_tableを2回呼び出すことでこれを行う1つの方法があります 。最初の呼び出しでは、ネストされたパスを使用して名前だけを取得しますが、それでもアドレス配列は保持します。 2回目の呼び出しでは、最初の呼び出しで生成された行ごとに個別にアドレスを解凍します。

    外側のselectでオプティマイザーヒントが使用されていることに注意してください 。これがないと、オプティマイザーは横方向の結合の不正な「ネスト解除」を試みるため、これが必要になります(outer apply )クエリをそのままにするのではなく、エラーをスローします。 (これはオプティマイザーの非常に一般的で迷惑な習慣です。無効なものを試行し、それについて文句を言います。)

    また、rownum は予約済みのキーワードです。出力の列名として使用することはできません。 (技術的には、追加の作業で可能ですが、できないと信じるのが最善です。)

    with
      t as (
        select * 
        from   json_Table(
    '{
     "Rownum": "1",
     "Name": "John",
     "AddressArray":["Address1", "Address2"],
     "TextObj":[{"mName" : "Carol","lName" : "Cena"},
                {"mName" : "Mark","lName" : "Karlo"}
               ]
    }', 
               '$' columns (
                     rownr        number                     path '$.Rownum', 
                     name         varchar2(100)              path '$.Name', 
                     addressArray varchar2(4000) format json path '$.AddressArray',
                     nested path '$.TextObj[*]'
                       columns  (mName varchar2(100) path '$.mName',
                                 lName varchar2(100) path '$.lName'
                                )
                   )
               )
      )
    select /*+ no_query_transformation */ rownr, name, mname, lname, address
    from t
         outer apply
         json_table (t.addressArray, '$[*]'
                       columns (address varchar2(10) path '$')
         )
    ;
    

    出力:

    ROWNR NAME   MNAME  LNAME  ADDRESS   
    ----- ------ ------ ------ ----------
        1 John   Carol  Cena   Address1  
        1 John   Carol  Cena   Address2  
        1 John   Mark   Karlo  Address1  
        1 John   Mark   Karlo  Address2 
    


    1. 名前を変更したファイル名をアップロードからデータベースに投稿

    2. JUnit / HSQLDB:HSQLDBを使用してテストするときにOracle構文のエラーを回避する方法(特権なしおよび/またはDUALオブジェクトなし)

    3. rake db:createがWin7x64で失敗する

    4. SQL:*異なる*行の値に基づいて行を選択するための代替手段ではありませんか?