JSONオブジェクト・アクセス式

JSONオブジェクト・アクセス式は、JSONデータの列を問い合せる場合にのみ使用されます。そのデータ内の1つ以上のJSON値を含む文字列を戻します。このタイプの式の構文は、ドット表記法構文といいます。

SQL/JSON問合せファンクションの場合と同様に、問合せ対象のJSON列は、整形式のJSONデータのみが含まれることが認識されている必要があります。つまり、そのデータ型はJSONVARCHAR2CLOBまたはBLOBである必要があります。型がJSONでない場合、その列にはIS JSONチェック制約が必要です。

ドット表記法問合せでアイテム・メソッドを使用しない場合、JSONデータを表すSQL値は次のように返されます:

  • 問い合せたデータの型がJSONである場合は、戻り値の型もJSONです。

  • 問い合せたデータが、テキストの型VARCHAR2CLOBまたはBLOBである場合は、返されるデータの型はVARCHAR2(4000)になります。

ドット表記法問合せで項目メソッドを使用しない場合、返されるJSONデータは、次のように対象となるJSONデータによって異なります。

  • 単一のJSON値が対象である場合、JSONスカラー、オブジェクトまたは配列のいずれであるかに関係なく、その値が返されます。

  • 複数のJSON値が対象である場合は、これらの値が要素であるJSON配列が返されます。(配列要素の順序は定義されません。)

単純なドット表記法を使用したJSONデータの問合せの詳細は、JSON開発者ガイドJSONデータに対する単純なドット表記法アクセスを参照してください。

json_object_access_expr::=

ドット表記法構文では、表の別名(必須)の後に、ドット(つまり、ピリオド(.))、JSON列の名前が続き、その後、形式. json_fieldのペア1つ以上、または. json_fieldarray_stepが続きます。ここでのjson_fieldはJSONフィールド名であり、array_stepは配列ステップ式です(JSON開発者ガイド基本的なSQL/JSONパス式の構文を参照)。

  • table_aliasでは、JSONデータの列を含む表の別名を指定します。この表の別名が必要であり、SQL文で表に割り当てる必要があります。

  • JSON_columnでは、JSONデータの列の名前を指定します。列のデータ型はVARCHAR2CLOBBLOBまたはJSONである必要があります。

    列がJSON生成ファンクション(JSON_QUERYまたはTREAT)の結果である場合、その列にはJSONデータ型のデータを格納できます。

    JSON型以外のデータ型を識別する場合、列にIS JSONチェック制約を定義できます。

  • 1つ以上のJSONオブジェクト・キーをオプションで指定できます。オブジェクト・キーによって、JSONデータの特定のJSON値を特定できます。最初のJSON_object_keyは、JSONデータのトップレベルのオブジェクト・メンバーのキー(プロパティ)名と大/小文字を区別して一致する必要があります。オブジェクト・メンバーの値が別のJSONオブジェクトである場合、オブジェクトのメンバーのキー名と一致する2番目のJSON_object_keyを指定でき、以降も同様です。これらの反復中にJSON配列が検出され、array_stepを指定しない場合、配列が暗黙的にアンラップされ、配列の要素がJSON_object_keyを使用して評価されます。

  • JSON値が配列の場合、オプションで1つ以上のarray_step句を指定できます。これにより、JSON配列の特定の要素にアクセスできます。

    • integerを使用して、JSON配列の索引integerの要素を指定します。integer TO integerを使用して、2つのinteger索引値の間(これらの値を含む)の要素の範囲を指定します。指定された要素が評価されるJSON配列にある場合、配列ステップはそれらの要素と一致する結果になります。それ以外の場合、一致しない配列ステップになります。JSON配列の最初の要素は索引0です。

    • ワイルド・カード記号であるアスタリスク(*)を使用して、JSON配列のすべての要素を指定します。評価されるJSON配列に少なくとも1つの要素が含まれる場合、JSON配列のすべての要素が一致する配列ステップになります。それ以外の場合、一致しない配列ステップになります。

JSON_object_keyを省略すると、この式は全体のJSONデータを含む文字列を戻します。この場合、文字列は、問い合せるJSONデータの列と同じデータ型です。

JSONオブジェクト・アクセス式は、4KBを超える値を返せません。値がこの制限を超えると、式はnullを返します。実際の値を取得するには、かわりにJSON_QUERY関数またはJSON_VALUE関数を使用して、RETURNING句に適切な戻り型を指定します。

JSONオブジェクト・アクセス式の照合導出ルールは、JSON_QUERYファンクションのものと同じです。

関連項目:

JSON_QUERYファンクションの照合導出ルールは、『Oracle Databaseグローバリゼーション・サポート・ガイド』の付録Cを参照してください。

次の例では、JSONドキュメントを含む表の作成: 例で作成されるj_purchaseorder表を使用します。この表には、po_documentと呼ばれるJSONデータの列が含まれます。これらの例では、列po_documentからJSON値を戻します。

次の文は、PONumberというキー名のプロパティの値を返します。戻り値の1600はSQLの番号です。

SELECT po.po_document.PONumber.number()
  FROM j_purchaseorder po;

PONumber
--------
1600

次の文は、値がJSONオブジェクトであるキー名ShippingInstructionsを使用したプロパティを最初に対象とします。この文は、そのオブジェクト内のキー名Phoneを使用したプロパティを対象とします。この文は、JSON配列であるPhoneの値を戻します。

SELECT po.po_document.ShippingInstructions.Phone
  FROM j_purchaseorder po;
 
SHIPPINGINSTRUCTIONS
-------------------------------------------------------------------------------------
[{"type":"Office","number":"909-555-7307"},{"type":"Mobile","number":"415-555-1234"}]

次の文は、値がJSON配列であるキー名LineItemsを使用したプロパティを最初に対象とします。この式は配列を暗黙的にアンラップし、JSONオブジェクトである要素を評価します。次に、この文は、アンラップされたオブジェクト内のキー名Partを使用したプロパティを対象とし、2つのオブジェクトを確認します。この文は、それらのオブジェクト内のキー名Descriptionを使用したプロパティを対象とし、文字列値を確認します。複数の値が戻されるため、値はJSON配列の要素として戻されます。

SELECT po.po_document.LineItems.Part.Description
  FROM j_purchaseorder po;
 
LINEITEMS
-----------------------------------
[One Magic Christmas,Lethal Weapon]

関連項目:

ドット表記法構文を使用したJSONデータの問合せの詳細は、Oracle Database JSON開発者ガイドを参照してください。