複数キー型指定のJSON索引

索引は、その定義に、複数キー・ステップ(keys()、values()、または[])使用するjson索引パスが少なくとも1つ含まれている場合、複数キー型指定のjson索引になります。また、索引パスでvalues()または[]を使用する場合は、CREATE INDEX文での宣言の後にpath_typeを続ける必要があります。前述のように、任意の表の行で評価された場合、このような索引パスはゼロ以上の項目を返す必要があり、返される各項目は、NULL、JNULL、または宣言済の型のインスタンスである必要があります。

複数キー型指定のjson索引は、非json複数キー索引と非常によく似ています。実際、複数キー索引の項の説明は、ほとんど同様にjson索引に適用されます。唯一の違いは、実際の行は配列またはマップが予想される場所にないことです。次に例を示します。
  • a.b.c[].dをjson索引パスにします。cの後に[]が表示されることは、ユーザーがcを(dフィールドのあるjsonオブジェクトを含む)配列にすることを意味します。また、a、b、dは配列になりません。Oracle NoSQL Databaseでは、後から制約が適用されますが、cを任意の種類の項目にすることができます。配列でない場合は、その単一項目を含む配列であるかのように処理されます。つまり、表の各行について、問合せ内のDMLパス式と同じようにパスa.b.c[].dが評価されます。cが原子性の場合、結果はEMPTYになります。cがマップの場合、そのマップ内のdフィールドの値(存在する場合)が索引付けされます。
  • a.b.c.values().dをjson索引パスにします。cの後にvalues()が表示されることは、ユーザーがcを(dフィールドのあるjsonオブジェクトを含む) jsonオブジェクトにすることを意味します。また、a、b、dは配列になりません。この場合、cは配列でない可能性もあります(配列内のすべてのオブジェクトおよび各オブジェクトのすべての値が索引付けされるため)。ただし、cは原子性である場合があり、この場合、結果はEMPTYになります。

次の例は、複数キー索引の項の例のjsonバージョンです。

例8-18 複数キー型指定のjson索引

CREATE INDEX jmidx1 ON users3 (
    info.connections[] AS INTEGER);

接続配列の要素の索引を作成します。Users3のサンプル行のこの索引の内容は、次のとおりです。

[ 5, 4 ]
[ 10, 0 ]
[ 20, 0 ]
[ 30, 4 ]
[ 100, 0 ]
[ EMPTY, 1 ]
[ EMPTY, 5 ]
[ JNULL, 2 ]
[ JNULL, 4 ]
[ NULL, 3 ]

例8-19 複数キー型指定のjson索引

CREATE INDEX jmidx2 ON users3 (
    info.address.phones[].area AS INTEGER,
    info.income AS INTEGER);

ユーザーの市外局番と収入の索引を作成します。Users3のサンプル行のこの索引の内容は、次のとおりです。

[ 408, 1000, 0 ]
[ 408, EMPTY, 4 ]
[ 408, JNULL, 1 ]
[ 415, 1000, 0 ]
[ EMPTY, 2000, 2 ]
[ EMPTY, EMPTY, 5 ]
[ EMPTY, JNULL, 1 ]
[ JNULL, 1000, 0 ]
[ NULL, NULL, 3 ]

例8-20 複数キー型指定のjson索引

CREATE INDEX jmidx2u ON users3 (
    info.address.phones[].area AS ANYATOMIC,
    info.income AS INTEGER)

これはjmidx2索引のバリエーションで、最初の索引パスは型指定されず、2番目の索引パスが型指定されています。jmidx2とjmidx2uの内容は同じですが、jmidx2uの場合は最初の列の数値が整数ではなく数値として格納されます。

例8-21 複数キー型指定のjson索引

CREATE INDEX jmidx3 ON users3 (
    info.address.phones[].area AS INTEGER,
    info.address.phones[].kind AS string,
    info.income AS INTEGER);

ユーザーの市外局番、電話番号の種類および収入の索引を作成します。Users3のサンプル行のこの索引の内容は、次のとおりです。

[ 408, "home", JNULL, 1 ]
[ 408, "work", 1000, 0 ]
[ 408, "work", EMPTY, 4 ]
[ 408, "work", JNULL, 1 ]
[ 415, "work", 1000, 0 ]
[ EMPTY, EMPTY, 2000, 2 ]
[ EMPTY, EMPTY, EMPTY, 5 ]
[ EMPTY, EMPTY, JNULL, 1 ]
[ JNULL, "home", 1000, 0 ]
[ NULL, NULL, NULL, 3 ]

例8-22 複数キー型指定のjson索引

CREATE INDEX jmidx4 ON users3 (
    info.expenses.keys(),
    info.expenses.values() AS INTEGER);

費用マップのフィールド(キーと値の両方)に索引を作成します。索引定義のkeys()部分は型を宣言できません。これは、型が常に文字列であるためです。Users2のサンプル行のこの索引の内容は、次のとおりです。

[ "books", 50, 0 ]
[ "clothes", 230, 0 ]
[ "housing", 1000, 0 ]
[ "housing", 1000, 1 ]
[ "housing", 1000, 4 ]
[ "travel", 300, 1 ]
[ "housing", 1000, 4 ]
[ EMPTY, EMPTY, 2 ]
[ EMPTY, EMPTY, 5 ]
[ NULL, NULL, 3 ]