単純型指定のJSON索引
単純型指定のjson索引パスの形式は、name_path path_typeです。非json索引パスと同様に、name_pathが表のいずれかの行で評価される場合は、最大で1つのアトミック項目を返す必要があり、配列をまたぐことはできません。非json索引の場合、結果項目の型は常に同じであり、表スキーマによって導出できます。これはスキーマなしjsonデータの場合には可能ではなく、その結果として、path_typeを使用して、索引付きフィールドの型を宣言および強制することが必要になります。このような宣言の影響として、name_pathが任意の表の行で評価された場合、空の結果、NULL、json null、または宣言された型のインスタンスが返されることがあげられます。前述のように、結果が空の場合、特殊なEMPTY値が結果として使用されます。さらに、path_typeがanyAtomicの場合、索引フィールドには型の制限が設定されません(ただし、CPUとストレージ・コストは除きます)。
CREATE INDEX文が1つ以上の単純型指定のjsonパスで構成され、他のすべてのパスも単純型指定のjsonまたは非jsonの場合、索引は単純型指定のjson索引です。このような索引の内容は、非jsonの単純索引と同じ方法で判断されます。
次の例は、単純索引の項の例のjsonバージョンです。
例8-13 単純型指定のjson索引
CREATE INDEX jidx1 ON users3(info.income AS INTEGER);
Users表にユーザーごとに1つのエントリを持つ索引が作成されます。エントリには、行によって表されるユーザーの所得とID (主キー)が含まれています。Users3のサンプル行のこの索引の内容は、次のとおりです。
[ 1000, 0 ]
[ 2000, 2 ]
[ EMPTY, 4 ]
[ EMPTY, 5 ]
[ JNULL, 1 ]
[ NULL, 3 ]
例8-14 単純型指定のjson索引
CREATE INDEX jidx1u ON users3 (
info.income AS ANYATOMIC)
型なしの索引がinfo.incomeに作成されます。この索引の内容は、前述のjidx1と同じですが、値1000と200は整数ではなく数値として格納されます。次の行がusers3表に追加されている場合:
INSERT INTO users3 VALUES (
6,
{
"address": {},
"expenses" : {},
"connections" : []
}
)
The index will look like this:
[ "none", 6 ]
[ EMPTY, 5 ]
[ EMPTY, 4 ]
[ NULL, 3 ]
[ 2000, 2 ]
[ JNULL, 1 ]
[ 1000, 0 ]
例8-15 単純型指定のjson索引
CREATE INDEX jidx2 ON users3 (
info.address.state AS STRING,
info.address.city AS STRING,
info.income AS INTEGER);
Users表にユーザーごとに1つのエントリを持つ索引が作成されます。エントリには、行によって表されるユーザーの州、市、所得およびID (主キー)が含まれています。Users3のサンプル行のこの索引の内容は、次のとおりです。
[ "CA", "San Fransisco", EMPTY, 4 ]
[ "CA", "San Fransisco", JNULL, 1 ]
[ "CA", "San Jose", 2000, 2 ]
[ "MA", "Boston", 1000, 0 ]
[ "OR", "Portland", EMPTY, 5 ]
[ NULL, NULL, NULL, 3 ]
例8-16 単純型指定のjson索引
CREATE INDEX jidx3 ON users3 (
info.expenses.books AS INTEGER);
ユーザーごとに索引エントリを作成します。このエントリには、ユーザーが書籍への支出を記録する場合は、ユーザーの書籍への支出が含まれ、expensesにbooksエントリがない場合またはexpensesマップが一切存在しない場合はEMPTY、infoが一切存在しない場合(info列の値がNULLである場合)はNULLが含まれます。Users3のサンプル行のこの索引の内容は、次のとおりです。
[ 20, 0 ]
[ EMPTY, 1 ]
[ EMPTY, 2 ]
[ EMPTY, 4 ]
[ EMPTY, 5 ]
[ NULL, 3 ]
例8-17 単純型指定のjson索引
CREATE INDEX jidx4 ON users3 (
info.expenses.housing AS INTEGER,
info.expenses.travel AS INTEGER);
ユーザーごとに索引エントリを作成します。エントリには、(a)ユーザーの住居費用、あるいはユーザーが住宅費用を記録しないまたはexpensesフィールドが一切存在しない場合はEMPTY、および(b)ユーザーの出張費用、あるいはユーザーが出張経費を記録しない場合またはexpensesフィールドが一切存在しない場合はEMPTY、のように2つのフィールドが含まれます。infoがNULLの場合、索引エントリの両方のフィールドがNULLになります。Users3のサンプル行のこの索引の内容は、次のとおりです。
[ 1000, 300, 1 ]
[ 1000, 300, 4 ]
[ 1000, EMPTY, 0 ]
[ EMPTY, EMPTY, 2 ]
[ EMPTY, EMPTY, 5 ]
[ NULL, NULL, 3 ]