基本的な問合せ

Oracle NoSQL Databaseでは、JSONは内部で解析されてネイティブ・データ形式で格納されるため、JSONデータの問合せは他の列タイプでのデータの問合せと変わりません。これらの問合せの作成方法を示す初歩的な例は、単純なSELECT問合せおよび複合データの操作を参照してください。

このJSONPersonsの例では、各個人のすべてのデータがpersonという名前のJSONタイプの列に格納されます。このデータはJSONオブジェクトとして示され、Map(JSON)タイプに内部でマッピングされます。他のタイプのマップを問い合せるときと同様に、この列の情報を問い合せることができます。次に例を示します。

sql-> SELECT id, j.person.lastname, j.person.age FROM JSONPersons j;
 +----+---------------------+------------+
 | id |      lastname       |    age     |
 +----+---------------------+------------+
 |  3 | Morgan              | 38         |
 +----+---------------------+------------+
 |  2 | Anderson            | 35         |
 +----+---------------------+------------+
 |  5 | Scully              | 47         |
 +----+---------------------+------------+
 |  1 | Morrison            | 25         |
 +----+---------------------+------------+
 |  4 | Smith               | 38         |
 +----+---------------------+------------+
 |  6 | NULL                | NULL       |
 +----+---------------------+------------+
 |  7 | NULL                | NULL       |
 +----+---------------------+------------+

7 rows returned 

この問合せから戻される最後の2行には、すべてNULLが含まれています。これは、表の他の行に値を移入するために使用されたオブジェクトとは異なるJSONオブジェクトを使用して、これらの行に値が移入されているためです。このJSONの機能は、強みでもあり、弱みでもあります。強みは、スキーマを簡単に変更できることです。ただし、注意しないと、大小の違いのあるデータが表に含められるおそれがあります。

JSONオブジェクトはマップとして格納されるため、列に対して通常のマップ・ステップ関数を使用できます。次に例を示します。

sql-> SELECT id, j.person.expenses.keys($value > 1000) as Expenses 
from JSONPersons j;
+----+---------------------+
 | id |      Expenses       |
 +----+---------------------+
 |  3 | food                |
 +----+---------------------+
 |  2 | food                |
 |    | travel              |
 +----+---------------------+
 |  4 | clothes             |
 |    | food                |
 |    | shoes               |
 +----+---------------------+
 |  6 | NULL                |
 +----+---------------------+
 |  5 | clothes             |
 +----+---------------------+
 |  7 | NULL                |
 +----+---------------------+
 |  1 | NULL                |
 +----+---------------------+

7 rows returned 

ここで、ID 1がNULLになっているのは、そのユーザーには$1000を超える支出がないためであり、ID 6および7がNULLになっているのは、これらにj.person.expensesフィールドがないためです。