5 SODAフィルタ仕様(参考)
パターン一致によってコレクション内のJSONドキュメントを選択できます。SODAフィルタ仕様(QBE)の詳細な定義を示します。
フィルタ仕様は例による問合せ(QBE)または簡潔にフィルタ,とも呼ばれ、JSONで表されるパターンを使用するSODA問合せです。QBE自体はJSONオブジェクトです。SODAの問合せ操作では、QBEを使用して、それを満たすコレクション内のすべてのJSONドキュメントを選択します。つまり、フィルタはそれらのドキュメントでのみtrueと評価されることを意味します。したがって、QBEは、それを満たすドキュメントが所有する必要のある特性を指定します。
フィルタには、名前がドル記号文字($
)で始まる事前定義済のJSONフィールドであるQBE演算子を使用できます。演算子フィールドに関連付けられたJSON値は、そのオペランドまたはその引数と呼ばれます。脚注1
SODA演算子自体はJSONフィールドですが、フィルタ仕様の説明として簡単に言うと、「フィールド」という用語は、通常、ここではSODA演算子ではないJSONフィールドのことです。また、QBEにおいて、「フィールド」は非公式に「フィールドへのパス」として使用されることがあります。
ノート:
SODAフィルタ仕様では、非数値、非ブール、非null
の各JSON値を二重引用符("
)で囲む厳密なJSON構文を使用する必要があります。特に、SODA演算子も含めて、すべてのJSONフィールド名を二重引用符で囲む必要があります。
フィルタ仕様はJSONオブジェクトです。フィルタ仕様には2種類あります。
-
複合フィルタ。
-
フィルタ条件フィルタ。
フィルタ仕様(QBE)は問合せの最上位(ルート)レベルでのみ指定できます。ただし、フィルタ条件はフィルタ条件フィルタ(QBE)として(a)単独で使用することも、(b)下位レベルで複合フィルタの問合せ句で使用することもできます。
ノート:
一般に、例による問合せ(QBE)は、JSONドキュメントの問合せ用です。QBE演算子$id
および$textContains
は、異種コレクション(メディア・タイプ列を含むコレクション)で例外的に使用できます。演算子$textContains
は、異種コレクションでのみ使用できます。(異種コレクションにはJSONドキュメントを含めることができますが、必要ではありません。)
SODA for JavaおよびSODA for RESTでは、演算子$textContains
はサポートされず、異種コレクションで使用するための演算子$id
もサポートされません。
関連項目:
厳密なJSON構文および緩慢なJSON構文の詳細は、Oracle Database JSON開発者ガイドを参照
- 複合フィルタ仕様(参考)
複合フィルタ仕様(例による問合せ、つまりQBE)は最上位レベルにのみ出現できます。つまり、別の複合フィルタの内側またはフィルタ条件の内側に複合フィルタをネストできません。 - フィルタ条件(参考)
フィルタ条件は、フィルタ仕様として単独で使用することも、下位レベルで複合フィルタ仕様の問合せ句で使用することもできます。
関連トピック
5.1 複合フィルタ(参考)
複合フィルタ仕様(例による問合せ、QBE)は最上位レベルでのみ指定できます。つまり、別の複合フィルタの内側またはフィルタ条件の内側に複合フィルタをネストできません。
複合フィルタは、次の各句に最大1つのメンバーを持つオブジェクトです。脚注2
-
問合せ句
書式は
$query :
filter_condition
です。 -
Orderby句
$orderby :
orderby_spec
という形式になります。これは、選択したドキュメントのソート順を指定する配列またはオブジェクトです。
句の順番は重要ではありません。句の欠如は、空のオブジェクトであるオペランドに演算子を適用した場合と同じ効果を持ちます。問合せ句が存在しないと、すべての文書が選択されます。orderby句がない場合は、順序が指定されません。
次のコンポジット・フィルタには、問合せ句とorderby句が含まれています。この問合せ句は、値が10,000より大きいsalary
フィールドがあるドキュメントを選択します。orderby句は、選択したドキュメントを、まずage
の降順で、次にzip
コードの昇順でソートします。
{ "$query" : { "salary" : { "gt" : 10000 } },
"$orderby" : { "age" : -1, "zip" : 2 } }
- Orderby句による選択したオブジェクトのソート
orderby句を含むフィルタ仕様(例による問合せ、つまりQBE)では選択したJSONドキュメントをソートして返します。
関連トピック
親トピック: SODAフィルタ仕様(参考)
5.1.1 Orderby句による選択したオブジェクトのソート
orderby句を含むフィルタ仕様(例による問合せ、QBE)では選択したJSONドキュメントをソートして返します。
順序指定を制御する方法は2通りあり、orderby句の構文が異なります。
-
配列構文を使用すると、使用されるSQLデータ型を指定し、フィールドの順序を簡単に制御できます。ソートは、まず指定された最初のフィールドで、次に2番目のフィールドで、というように行われます。
この構文には、エラーまたは空のフィールドを処理するデフォルトの動作を変更する必要があるかどうかに応じて、2つの種類があります。
-
省略構文では、使用するSQLデータ型を指定できません。最も省略した形では、ソートに使用されるフィールドの順序も制御されません。
orderby句の配列構文
最も単純なorderby配列構文は、演算子$orderby
の後に、オブジェクトの配列が続きます。各オブジェクトには、候補オブジェクトのルートから特定のフィールドをターゲット指定するpath
フィールドがあり、次に各フィールドのそれぞれを次に1つ指定します。
-
datatype
には、使用するSQLデータ型を指定します。"varchar2"
(デフォルト)、"number"
、"date"
、"datetime"
、"timestamp"
、"string"
、"varchar"
のいずれかになります。(値datetime
は、timestamp
のシノニムです。値"string"
および"varchar"
は、"varchar2"
のシノニムです。)これらの値は、それぞれSQLデータ型
VARCHAR2
、NUMBER
、DATE
およびTIMESTAMP
に対応します。ノート:
date
またはtimestamp
のdatatype
値を使用するには、Oracle Databaseリリース18c以上が必要です。 -
order
は、フィールド値を昇順(asc
)と降順(desc
)のどちらにするかを指定します(デフォルト:"asc"
) -
maxLength
は、ターゲット文字列値の最大長(文字数)を指定する正の整数です。文字列がこの制限を超えると、エラーが発生します。$lax
(次を参照)を使用すると、エラーの発生を抑止し、長すぎる文字列を無視してソートすることができます。フィールドmaxLength
は、datatype
が"varchar2"
の場合にのみ適用されます。
たとえば、次のフィルタ仕様では、フィールドsalary
の値が10,000より大きく20,000以下であるオブジェクトを選択します。オブジェクトは、まず数値として解釈されてage
の降順でソートされ、次に文字列として解釈されてname
の昇順でソートされます。
{ "$query" : { "salary" : { "$gt" : 10000, "$lte" : 20000 } },
"$orderby" :
[ { "path" : "age", "datatype" : "number", "order" : "desc" },
{ "path" : "name", "datatype" : "varchar2", "order" : "asc" } ] }
次のSQL SELECT
文の抜粋と類似しています。
WHERE (salary > 10000) AND (salary <= 20000) ORDER BY age DESC, name ASC
この構文は、ほとんどの目的に対応します。ターゲット・フィールドが存在せず、他のエラーが検出されたという理由だけで、エラーが発生することはありません。脚注3
欠落しているフィールドまたはエラーの特別な処理を指定する必要がある場合は、より複雑な配列構文を使用する必要があります。これにより$fields
オブジェクト内の配列がラップされ、別のフィールド$scalarRequired
または$lax
を$orderby
オブジェクトに追加できます。$lax
と$scalarRequired
の両方にtrue
値を指定することはできません。指定すると、問合せ時に構文エラーが発生します。
-
$scalarRequired
- ブール値。オプションです。true
に設定した場合、ターゲット・フィールドが存在し、その値はdatatype
データ型に変換可能なJSONスカラーである必要があります。一致したドキュメントについて、そうでない場合には問合せ時にエラーが発生します。脚注4 -
$lax
— ブール値。オプションです。true
に設定した場合、ターゲット・フィールドが存在する必要も、その値がdatatype
データ型に変換可能なJSONスカラーである必要もありません。一致したドキュメントについて、そうでない場合でも問合せ時にエラーは発生しません。脚注5
scalarRequired
もlax
もtrue
と指定されていない場合は、デフォルトのエラー処理動作が適用されます(ターゲット・フィールドが存在しないというだけでエラーは発生せず、検出されたその他のエラーは発生します)。
たとえば、このフィルタ仕様の動作は前述の動作と同じですが、ターゲット・フィールドのいずれかが欠落している場合にはエラーが発生します。
{ "$query" : { "salary" : { "$gt" : 10000, "$lte" : 20000 } },
"$orderby" :
{ "$fields" : [ { "path" : "age",
"datatype" : "number",
"order" : "desc" },
{ "path" : "name",
"datatype" : "varchar2",
"order" : "asc",
"maxLength" : 100 } ],
"$scalarRequired" : true } }
ノート:
Oracle Databaseリリース12c (12.1.0.2)を使用する場合、$scalarRequired
または$lax
を指定する必要があります。そうしないと、構文エラーが発生します。
ノート:
orderby句を持つQBEのターゲットとなっているフィールドのいずれかに対してBツリー索引を定義している場合、その問合せで取得されるには、indexNulls
値true
に設定して索引を指定する必要があります。
関連項目:
-
SQL/JSONのエラー処理の値
ERROR ON ERROR
とNULL ON ERROR
の詳細は、Oracle Database JSON開発者ガイドを参照してください -
SQL/JSONの空フィールド処理の値
NULL ON EMPTY
とERROR ON EMPTY
の詳細は、Oracle Database JSON開発者ガイドを参照してください
Orderby句の省略構文
省略した$orderby
構文は、ソートに使用するフィールドを、個々の方向およびフィールド間のソート順とともに指定します。ソート用にフィールド値を解釈するときに使用するSQLデータ型は指定せず、文字列ソートを最初のN文字に制限することはできません。
orderby省略構文は、"$orderby"
とそれに続く1つ以上のメンバーを含むオブジェクトであり、そのフィールドはソートに使用されます。
"$orderby" : { field1 : direction1, field2 : direction2, ... }
各field
は、候補オブジェクトのルートからのパスとして解釈される文字列です。
各direction
はゼロ以外の整数です。返されたドキュメントは、field
値をキーにして、値が正数か負数かに応じてそれぞれ昇順または降順にソートされます。
$orderby
オペランドのフィールドは、大きさの順(絶対値)の小さいものから大きいものの順にソートされます。たとえば、値が-1のフィールド、値が2のフィールド、値が3のフィールドの順にソートされます。通常どおり、$orderby
のオブジェクト値内のフィールドの順序は重要ではありません。
2つ以上のソート方向の絶対値が等しい場合、フィールドのソート順序は、JSONドキュメントの作成に使用したシリアライズ済JSONコンテンツに出現する順序で決定されます。
特に外部ツールまたはライブラリを使用してJSONコンテンツを作成し、結果のコンテンツがシリアライズされる順序が不明な場合、フィールドが使用される順序を正確に制御するために、絶対値が等しくないソート方向を使用することをお薦めします。
この問合せはOrderby句の配列構文の1つのように機能しますが、ここではデータ型の解釈が指定されず(フィールドname
に文字列値があることが前提)、name
のすべての文字がここでのソートに使用されます。ここでは、オブジェクト・メンバーの順序は関係ありません。特に、どのフィールドが先にソートされるかは指定されません。値の大きさによって決まります。
{ "$query" : { "salary" : { $between [10000, 20000] } },
"$orderby" : { "age" : -1, "name" : 2 } }
次のSQL SELECT
文の抜粋と類似しています。
WHERE (salary >= 10000) AND (salary <= 20000) ORDER BY age DESC, name ASC
親トピック: 複合フィルタ(参考)
5.2 フィルタ条件(参考)
フィルタ条件はフィルタ仕様として単独で使用することも、下位レベルで複合フィルタ仕様の問合せ句で使用することもできます。
フィルタ条件は、メンバーが次の1つ以上の句を形成するJSONオブジェクトです。
-
スカラー等価句
-
フィールド条件句
-
論理組合せ句
-
ネストされた条件句
-
ID句
-
text-contains句
-
特殊基準句
フィルタ条件は、そのすべての句がtrueの場合にのみtrueになります。フィルタ条件は空(空のオブジェクト{}
)でもかまいません。この場合、すべての(ゼロ)句は空になります(フィルタ条件が満たされます)。
たとえば、QBEにフィルタ条件が1つしかなく、空の場合、コレクションのすべてのドキュメントが選択されます。この場合、検索操作はすべてのドキュメントを返し、削除操作はそれらをすべて削除します。
- スカラー等価句(参考)
スカラー等価句は、指定したオブジェクト・フィールドが指定したスカラー値と等しいかどうかをテストします。 - フィールド条件句(参考)
フィールド条件句は、指定したオブジェクト・フィールドが指定した一連の基準を満たす必要があることを指定します。これは、それぞれが比較句、not句または項目メソッド句である1つ以上の条件演算子句を使用して、フィールドを制約します。 - 論理組合せ句(参考)
論理組合せ句は、複数の空でないフィルタ条件の結果を組み合せます。 - ネストされた条件句(参考)
QBEのネストされた条件句を使用して、複数の条件をオブジェクトである配列要素に同時に適用します。 - ID句(参考)
他の例による問合せ(QBE)の演算子は、一般に、ドキュメントのコンテンツ内で特定のJSONフィールドを検索して、その値を照合しようとします。ID句は、演算子$id
を使用し、かわりにドキュメント・キーを照合します。したがって、ドキュメントのコンテンツではなくドキュメントのメタデータを照合します。 - text-contains句(参考)
text-contains句は、全文検索パターン$textcontains:pattern
として使用される文字列値を持つ演算子$textContains
です。ドキュメントの一部のテキストがそのパターンと一致する場合にのみ、非JSONドキュメントと一致します。一致はOracle Textの全文一致です。 - 特殊基準句(参考)
特殊基準句は、空間句(演算子$near
、$intersects
または$within
を使用)、またはContains句(演算子$contains
を使用)です。
親トピック: SODAフィルタ仕様(参考)
5.2.1 スカラー等価句(参考)
スカラー等価句は、指定したオブジェクト・フィールドが指定したスカラー値と等しいかどうかをテストします。
スカラー等価句は、スカラー値を持つオブジェクト・メンバーです。これは、フィールドの値がスカラーに等しいかどうかをテストします。
field : scalar
(注意: JSONスカラーはオブジェクトまたは配列以外の値であり、JSON数値、文字列、true
、false
またはnull
です。)
スカラー等価句は、フィールド条件句と同じ動作で、演算子$eq
を使用して同じフィールド値をテストする比較句を持っています。つまり、field : scalar
はfield : { "$eq" : scalar }
と同等です。
動作は同等でも、対応する"$eq" : field
メンバーを使用できるコンテキストの中には、スカラー等価句を使用できないものがあります。たとえば、スカラー等価句はnot句で使用できません。not句の引数配列の配列要素は比較句である必要があります。
親トピック: フィルタ条件(参考)
5.2.2 フィールド条件句(参考)
フィールド条件句は、指定したオブジェクト・フィールドが指定した一連の基準を満たす必要があることを指定します。これは、それぞれが比較句、not句または項目メソッド句である1つ以上の条件演算子句を使用して、フィールドを制約します。
フィールド条件句はJSONオブジェクト・メンバーで、そのフィールドは演算子でなく、その値が条件演算句である1つ以上のメンバーを含むオブジェクトです。
field : { condition-operator-clause ... }
フィールド条件句は、フィールドがすべての条件演算子句を満たしているかどうかをテストします。これは暗黙的にAND演算されます。
条件演算子句は次のいずれかになります。
-
比較句
-
not句
-
項目メソッド句
ノート:
配列ステップで終わらないパスが比較句またはnot句を使用し、パスが配列を対象としている場合、テストは配列の各要素に適用されます。
たとえば、"cat"
が配列要素であっても、QBE {"animal" : {"$eq" : "cat"}}
はJSONデータ{"animal" : ["dog", "cat"]}
と一致します。QBE {"animal" : {$not : {"$eq" : "frog"}}}
は同じデータと一致します。これは、各配列要素が"frog"
と等しいかどうかがテストされ、このテストが失敗するためです。
- 比較句(参考)
比較句は、そのフィールドが比較演算子であるオブジェクト・メンバーです。例:"$gt" : 200
。 - not句(参考)
not句は、比較句のセットの真理値を論理的に否定します。比較句のいずれかがtrueの場合、not句はfalseと評価され、それらのすべてがfalseの場合、not句はtrueと評価されます。 - 項目メソッド句(参考)
項目メソッド句は、項目メソッド等価句または項目メソッド修飾子句です。通常、フィールド値を変更するために、出現先のフィールド条件句のフィールドに項目メソッドを適用します。次に、結果を項目メソッドのオペランドと照合します。 - ISO 8601の日付、時刻および継続時間のサポート
国際標準化機構(ISO)の標準8601は、日付、時刻および継続時間を表すために国際的に受け入れられている方法について説明しています。Oracle Databaseでは、適切なOracle SQLの日付、時刻および時間隔(継続時間)の値として最も一般的なISO 8601形式をサポートしています。サポートされている形式は、基本的に数字のみで言語に依存しない明確な形式です。
親トピック: フィルタ条件(参考)
5.2.2.1 比較句(参考)
比較句は、そのフィールドが比較演算子であるオブジェクト・メンバーです。例:"$gt" : 200
。
表5-1は比較演算子について説明しています。「説明」列の例で使用されているドキュメントについては、サンプルJSONドキュメントを参照してください。
表5-1 例による問合せ(QBE)の比較演算子
演算子 | 説明 |
---|---|
|
フィールドが存在するかどうかをテストします。次のいずれかの場合にドキュメントと一致します。
オペランド JSONスカラー。 例
サンプル・ドキュメント3と一致します。
サンプル・ドキュメント1および2と一致します。 |
|
フィールドの値がオペランドの値と等しい場合にのみ、ドキュメントと一致します。 オペランド JSONスカラー。 例
サンプル・ドキュメント1と一致します。 |
|
フィールドの値がオペランドの値と等しくないか、ドキュメント内にこのようなフィールドがない場合にのみ、ドキュメントと一致します。 オペランド JSONスカラー。 例
サンプル・ドキュメント2および3と一致します。 |
|
フィールドの値がオペランドの値より大きい場合にのみ、ドキュメントと一致します。 オペランド JSON数値または文字列。 例
サンプル・ドキュメント2と一致します。 |
|
フィールドの値がオペランドの値より小さい場合にのみ、ドキュメントと一致します。 オペランド JSON数値または文字列。 例
サンプル・ドキュメント1と一致します。 |
|
フィールドの値がオペランドの値以上の場合にのみ、ドキュメントと一致します。 オペランド JSON数値または文字列。 例
サンプル・ドキュメント1、2および3と一致します。 |
|
フィールドの値がオペランドの値以下の場合にのみ、ドキュメントと一致します。 オペランド JSON数値または文字列。 例
サンプル・ドキュメント1と一致します。 |
|
文字列または数値フィールド値が2つのオペランド配列要素の間にあるか、またはそれらのいずれかと等しい場合にのみ、ドキュメントと一致します。 オペランド 2つのスカラー要素のJSON配列。最初は2つのうち小さい方である必要があります。(文字列値の場合、辞書順で小さいほうが最初)。 要素のうち多くて1つを 例
サンプル・ドキュメント2および3と一致します。
サンプル・ドキュメント1、2および3と一致します。これは次と同等です。
|
|
フィールドの値がオペランドの値で始まる場合にのみ、ドキュメントと一致します。 オペランド JSON文字列。 例
サンプル・ドキュメント1と一致します。 |
|
フィールド値がオペランドと等しい部分文字列の文字列である場合にのみ、ドキュメントと一致します。 オペランド 空でないJSON文字列。 例
サンプル・ドキュメント1および2と一致します。 |
|
フィールドの値がオペランドの正規表現と一致する場合にのみ、ドキュメントと一致します。 オペランド JSON文字列としてSQL正規表現。 『Oracle Database SQL言語リファレンス』を参照してください。 例
サンプル・ドキュメント1と一致します。 |
|
フィールド値がオペランド・パターンと一致する場合にのみ、ドキュメントと一致します。 オペランド JSON文字列としてのSQL 『Oracle Database SQL言語リファレンス』を参照してください。 例
サンプル・ドキュメント2および3と一致します。 |
|
フィールドが存在し、その値がオペランド配列の少なくとも1つの値と等しい場合にのみ、ドキュメントと一致します。 オペランド 空ではない、スカラーのJSON配列。脚注6 例
サンプル・ドキュメント1および2と一致します。 |
|
次のうちのいずれかがtrueとなるドキュメントを見つけます。
オペランド 空ではない、スカラーのJSON配列。脚注6 例
サンプル・ドキュメント1および2と一致します。 |
|
次のうちのいずれかがtrueとなるドキュメントを見つけます。
オペランド 空ではない、スカラーのJSON配列。脚注6 例
サンプル・ドキュメント2と一致します。
サンプル・ドキュメント1および2と一致します。 |
脚注6
配列に少なくとも1つの要素が含まれていない場合、構文エラーが発生します。
関連トピック
親トピック: フィールド条件句(参考)
5.2.2.2 not句(参考)
not句は、比較句のセットの真理値を論理的に否定します。比較句のいずれかがtrueの場合、not句はfalseと評価され、それらのすべてがfalseの場合、not句はtrueと評価されます。
not句は、フィールドが演算子$not
であり、その値が比較句をメンバーとして持つオブジェクトであり、その論理積の真理値を否定する前に暗黙的にAND演算されているオブジェクト・メンバーです。
"$not" : { comparison-clause ... }
例:"$not" : {"$eq" : 200, "$lt" : 40}
。
次のフィールド条件句は、フィールドaddress.zip
がないドキュメント、およびこのフィールドは存在するが値が"90001"
以外のスカラー、または"90001"
に等しい要素がない配列であるドキュメントと一致します。
"address.zip" : {"$not" : {"$eq" : "90001"}}
一方、次のフィールド条件句では相補的な結果になります。つまり、その値がスカラー"90001"
であるか、そのスカラー値を含む配列であるフィールドaddress.zip
を持つドキュメントと一致します。
"address.zip" : {"$eq" : "90001"}}
ここでは、フィールドsalary
と、オペランド・オブジェクトに複数の比較句を持つnot句を値として含んだフィールド条件句の例を示します。これは、20,000より大かつ100,000より小、ではないsalary値と一致します。つまり、20,000以下または100,000以上のいずれかであるsalary値と一致します。
"salary" : {"$not" : {"$gt":20000, "$lt":100000}}
関連トピック
親トピック: フィールド条件句(参考)
5.2.2.3 項目メソッド句(参考)
項目メソッド句は、項目メソッド等価句または項目メソッド修飾子句です。通常、フィールド値を変更するために、出現先のフィールド条件句のフィールドに項目メソッドを適用します。次に、結果を項目メソッドのオペランドと照合します。
たとえば、項目メソッド演算子$timestamp
は、サポートされているISO 8601の日付形式の1つである文字列値フィールドをタイムスタンプとして解釈します。演算子が対象フィールドの値に適用された後、項目メソッド修飾子節を構成するnot句と比較句の評価などの他の処理が行われます。QBEは、JSONドキュメントにある生のフィールド・データのかわりに、変更されたデータを使用します。
場合によっては、項目メソッド演算子の適用はフィルタとしてのみ機能し、QBE結果セットから対象データを削除します。たとえば、項目メソッド$timestamp
が、サポートされているISO 8601の日付形式の1つでない文字列値に適用された場合、一致はありません。問合せは、そのフィールド・オカレンスをドキュメント内に存在しないものとして扱います。
ノート:
項目メソッド・フィールド(演算子)自体は、関連する値(そのオペランド)を使用または処理しません。かわりに、その親フィールドと一致するJSONデータの値に作用します。
たとえば、QBE {"birthday" : {"$date" : {"$gt" : "2000-01-01"}}}
で、項目メソッド演算$date
は親フィールドbirthday
と一致するJSONデータに作用します。JSONオブジェクト(この場合は比較句) {"$gt" : "2000-01-01"}
であるオペランドを使用したり作用することはありません。JSONドキュメント内の誕生日データ(ISO 8601形式のJSON文字列)は日付として解釈され、その日付が、(ISO日付)文字列"2000-01-01"
(2000年1月1日以降)で示された日付よりも大きいという条件と照合されます。
これには慣れるまでに少し時間がかかる可能性があります。オペランドは、項目メソッド演算子がジョブを実行した後に使用されます。これは、その親フィールドの値に対する演算子のアクションの結果と照合されます。項目メソッド演算子は一種のフィルタで、作用するデータと一致するフィールド(左側)と(その右側の)アクションの結果に適用されるいくつかのテストの間を構文的に表しています。
項目メソッド等価句
項目メソッド等価句は、そのフィールドが項目メソッド演算子であり、その値がJSONスカラーであるオブジェクトメンバーです。脚注7
item-method-operator : scalar
この句では、最初に項目メソッドをフィールド条件句のフィールドに適用します。次に、結果がスカラー値(オペランド)と等しいかどうかをテストします。
例: "$upper" : "john"
(項目メソッド等号句は、フィールド値(オペランド)が比較演算子$eq
を含む単一の比較句を持つオブジェクトである項目メソッド修飾子句(次を参照)と同等です。たとえば、"$upper" : "john"
は"$upper" : {"$eq" : "john"}
と同等です。)
項目メソッド修飾子句
項目メソッド修飾子句は、そのフィールドが項目メソッド演算子であり、その値(オペランド)が、比較句または最大1つのnot句をメンバーとして持つオブジェクトであるオブジェクト・メンバーです。項目メソッド演算子のオペランドは空オブジェクトにできません。
item-method-operator : { comparison-or-not-clause ... }Foot 8
この句では、最初に項目メソッドをフィールド条件句のフィールドに適用します。次に、その操作の結果が、すべての比較句と、オブジェクト値内のnot句を満たしているかどうかをテストします。
例:"$upper" : { "$between" : [ "ALPHA", "LAMBDA" ], "$not" : { "$startsWith" : "BE" } }
項目メソッド演算子
次に、各項目メソッド演算子について簡単に説明します。演算子のターゲットは、項目メソッド句が出現するフィールド条件句のフィールド、つまり演算子の親フィールドに一致するデータです。演算子のオペランドではありません。
表5-2 項目メソッド演算子
演算子 | 説明脚注9 |
---|---|
|
対象となるJSON数値の絶対値。 演算子のターゲット JSON数値 例
|
|
対象となるJSON値のブール型の解釈。 演算子のターゲット JSONブール値( 例
|
|
最も近い整数に切り上げられた対象となるJSON数値。 演算子のターゲット JSON数値 例
|
|
対象となるJSON文字列の日付解釈。 演算子のターゲット サポートされているISO 8601形式のJSON文字列 例
|
|
対象となるJSON数値または数値文字列値のSQL 演算子のターゲット JSON数値または数値文字列 例
|
|
最も近い整数に切り下げられた対象となるJSON数値。 演算子のターゲット JSON数値 例
|
|
対象となるJSON文字列内の文字数。 演算子のターゲット JSON文字列 例
|
|
対象となるJSON文字列内の文字に対応する小文字の文字列。 演算子のターゲット JSON文字列 例
|
|
対象となるJSON数値または数値文字列値のSQL
演算子のターゲット JSON数値または数値文字列 例
|
|
配列内の要素の数、スカラーまたはオブジェクトの場合は1。 演算子のターゲット 任意の種類のJSON値 例 値が複数の要素を持つ配列であるため、
|
|
対象となるJSONスカラーのSQL
演算子のターゲット
例
|
|
対象となるJSON文字列の日時解釈。 演算子のターゲット サポートされているISO 8601形式のJSON文字列 例
|
|
対象となるデータのJSON言語データ型の名前。小文字のJSON文字列です。
演算子のターゲット 任意の種類のJSON値 例
|
|
対象となるJSON文字列内の文字に対応する大文字の文字列。 演算子のターゲット JSON文字列 例
|
脚注9 スカラー等価の略称{field : {operator : value}}
は、ここの例全体で、それに相当する{field : {operator : {"$eq" : value}}}
のかわりに使用されます。
脚注10 演算子$date
のオペランドは、サポートされているISO 8601形式のJSON文字列である必要があります。それ以外の場合、一致は見つかりません。
脚注11 演算子$timestamp
のオペランドは、サポートされているISO 8601形式のJSON文字列である必要があります。それ以外の場合、一致は見つかりません。
ノート:
-
オペランドの型が間違っているなどのなんらかの理由で項目メソッドの変換が失敗した場合、パスは照合されず(参照データがない状態)、エラーは発生しません。
-
項目メソッド演算子が配列に適用される場合、このメソッドは実際には配列要素のそれぞれに適用されます。
たとえば、QBE
{"color" : {"$upper" : "RED"}}
は、大文字への変換時に"RED"
と一致する要素が配列にあるため、データ{"color" : ["Red", "Blue"]}
と一致します。QBEは{"color[*]" : {"$upper" : "RED"}}
と同等です - 演算子$upper
は、ターゲット・データの各配列要素に適用されます。
ノート:
-
項目メソッド演算子
$abs
、$date
、$size
、$timestamp
または$type
を使用するには、Oracle Databaseリリース18c以上が必要です。 -
他の項目メソッドを使用するには、Oracle Databaseリリース12c (12.2.0.1)以上が必要です。
親トピック: フィールド条件句(参考)
5.2.2.4 ISO 8601の日付、時刻および継続時間のサポート
国際標準化機構(ISO)の標準8601は、日付、時刻および継続時間を表すために国際的に受け入れられている方法について説明しています。Oracle Databaseでは、適切なOracle SQLの日付、時刻および時間隔(継続時間)の値として最も一般的なISO 8601形式をサポートしています。サポートされている形式は、基本的に数字のみで言語に依存しない明確な形式です。
(Simple Oracle Document Access(SODA)では継続時間はサポートされていません。)
ISOの日付および時刻のためのOracle Databaseの構文
これは、Oracle DatabaseでISOの日付および時刻に対してサポートされている構文です。
-
日付(のみ):
YYYY-MM-DD
-
日時:
YYYY-MM-DDThh:mm:ss[.s[s[s[s[s[s]]]]][Z|(+|-)hh:mm]
ここで:
-
YYYY
は年を4桁の10進数で指定します。 -
MM
は月を2桁の10進数の00
から12
で指定します。 -
DD
は日を2桁の10進数の00
から31
で指定します。 -
hh
は時を2桁の10進数の00
から23
で指定します。 -
mm
は分を2桁の10進数の00
から59
で指定します。 -
ss[.s[s[s[s[s]]]]]
は秒を2桁の10進数の00
から59
で、必要に応じて小数点と1桁から6桁の10進数(秒の小数部を表す)を続けて指定します。 -
Z
はUTC時間(タイムゾーン0)を指定します。(+00:00
で指定することもできますが、–00:00
で指定することはできません。) -
(+|-)hh:mm
はタイムゾーンをUTCとの差として指定します。(+
または–
のいずれか1つを指定する必要があります。)
時間値の場合、タイムゾーン部分はオプションです。これが指定されていない場合、UTC時間が仮定されます。
他のISO 8601日時構文はサポートされていません。特に:
-
ハイフンで始まるマイナスの日付(BCE 1年より前の日付) (たとえば
–2018–10–26T21:32:52
)はサポートされていません。 -
ハイフンおよびコロン区切文字を入力する必要があります。いわゆる「基本」形式の
YYYYMMDDThhmmss
はサポートされていません。 -
序数日(年+通日、暦週+日数)はサポートされていません。
-
4桁より大きい年の使用はサポートされていません。
サポートされている日付と時刻は次のとおりです。
-
2018–10–26T21:32:52
-
2018-10-26T21:32:52+02:00
-
2018-10-26T19:32:52Z
-
2018-10-26T19:32:52+00:00
-
2018-10-26T21:32:52.12679
サポートされていない日付と時刻は次のとおりです。
-
2018-10-26T21:32
(時刻が指定されている場合は、そのすべての部分が存在する必要があります) -
2018-10-26T25:32:52+02:00
(時の部分が25で、範囲外です) -
18-10-26T21:32
(年が完全に指定されていません)
ISOの継続時間のためのOracle Databaseの構文
ノート:
Oracle DatabaseではISOの継続時間がサポートされていますが、Simple Oracle Document Access (SODA)ではサポートされていません。
ISOの継続時間に対しては2つのOracle Databaseの構文がサポートされています。SQLファンクションto_dsinterval
に指定されるds_iso_formatと、SQLファンクションto_yminterval
に指定されるym_iso_formatがあります。(to_dsinterval
はSQL型INTERVAL DAY TO SECOND
のインスタンスを返し、to_yminterval
はINTERVAL YEAR TO MONTH
型インスタンスを返します。)
これらの形式は、OracleによってJSON言語に追加されたdaysecondInterval
およびyearmonthInterval
データ型にそれぞれ使用されます。
-
ds_iso_format:
PdDThHmMsS。ここで、d、h、mおよびsは、それぞれ日、時間、分および秒の数字です。たとえば、
"P0DT06H23M34S"
などです。sには、整数部の数字とそれに続く小数点および小数部の数字を指定することもできます。たとえば、
P1DT6H23M3.141593S
などです。値がゼロの数字は、その指定子とともに省略されます。たとえば、
"PT3M3.141593S"
などです。ただし、すべての数字がゼロ値である場合、構文は"P0D"
になります。 -
ym_iso_format
PyYmM。ここで、yは年の数字、およびmは月の数字です。たとえば、
"P7Y8M"
などです。年または月がゼロの場合は、それと指定子が省略されます。たとえば、
"P7Y"
、"P8M"
などです。ただし、年と月がゼロの場合、構文は"P0Y"
になります。
5.2.3 論理組合せ句(参考)
論理組合せ句は、複数の空でないフィルタ条件の結果を組み合せます。
論理組合せ句は論理組合せ演算子 ( $and
、$or
または$nor
)であり、空でない配列の1つ以上の空でないフィルタ条件が後に続きます。脚注12
この論理組合せ句は演算子$or
を使用します。条件のいずれかがtrue(または両方ともtrue)であれば、満たされます。つまり、ドキュメントに値が"Joe"
のフィールドname
が含まれている場合、または値が10000
のフィールドsalary
が含まれている場合に満たされます。
"$or" : [ {"name" : "Joe"}, {"salary" : 10000} ]
次の論理組合せ句は演算子$and
を使用します。配列オペランドにはメンバーとして2つのフィルタ条件があります。これらの句の2番目は演算子$or
を使用する論理組合せ句を含む条件です。この論理組合せ句は、両方の条件がtrueの場合に満たされます。つまり、ドキュメントに、値が少なくとも60
であるフィールドage
が含まれ、かつ、値が"Jason"
であるフィールドname
が含まれているかあるいは値が"tea"
であるフィールドdrinks
が含まれているかのいずれかの場合に満たされます。
"$and" : [ {"age" : {"$gte" : 60}},
{"$or" : [{"name" : "Jason"}, {"drinks" : "tea"}]} ]
- $andの省略
$and
の使用を省略することもできます。
親トピック: フィルタ条件(参考)
5.2.3.1 $andの省略
$and
の使用を省略することもできます。
フィルタ条件は、そのすべての句がtrueの場合にのみtrueになります。また、フィールド条件句は複数の条件を含むことができ、フィールド条件が全体としてtrueとなるには、そのすべてがtrueとなる必要があります。これらの基準のそれぞれにおいて、論理積(AND)は暗黙的になります。したがって、$and
の使用を省略して簡潔にできます。
これについては例5-1および例5-2に示していますが、これらの結果は同等です。演算子$and
は、例5-1では明示的であり、例5-2では暗黙的です(省略されています)。
このフィルタは、name
が「Fred」で始まり、かつsalaryが10,000より大きく20,000以下で、かつaddress.city
が「Bedrock」またはaddress.zip
が12345で、かつmarried
がtrue
のオブジェクトを指定します。
$and
の省略の概要は次のとおりです: $and
を省略した場合、結果フィルタのフィールドまたは演算子が同じオブジェクトの同じレベルで複数回出現しないようにします。
このルールでは、次のようにQBEを使用することはできません。ここでは、フィールドsalary
が同じオブジェクトの同じレベルで2回出現します。
{ "salary" : { "$gt" : 10000 },
"age" : { "$gt" : 40 },
"salary" : { "$lt" : 20000 } }
また、次のようにQBEを使用することもできません。ここでは、同じ条件演算子$regex
が同じ条件句でフィールドname
に複数回適用されています。
{ "name" : { "$regex" : "son", "$regex" : "Jas" } }
ここでの動作は、両方の$regex
基準がtrueの場合かつその場合にかぎり、フィールドの条件はtrueになりません。そのように動作させるには、次のようなQBEを使用します。
{ $and : [ { "name" : { "$regex" : "son" }, { "name" : { "$regex" : "Jas" } ] }
$and
の省略の概要ルールに従わない場合、同じフィールドまたは演算子を使用する競合する条件句のいずれか1つのみが評価されてもう一方が無視され、エラーは発生しません。salary
の例の場合、salary
フィールド条件句のいずれか1つのみが評価され、name
の例では、$regex
条件句のいずれか1つのみが評価されます。複数の条件句のセットのどれが評価されるかは定義されていません。
例5-1 明示的な$and演算子を使用したフィルタ仕様
{ "$and" : [ { "name" : { "$startsWith" : "Fred" } },
{ "salary" : { "$gt" : 10000, "$lte" : 20000 } },
{ "$or" : [ { "address.city" : "Bedrock" },
{ "address.zip" : 12345 } ] },
{ "married" : true } ] }
例5-2 暗黙的な$and演算子を使用したフィルタ仕様
{ "name" : { "$startsWith" : "Fred" },
"salary" : { "$gt" : 10000, "$lte" : 20000 },
"$or" : [ { "address.city" : "Bedrock" },
{ "address.zip" : 12345 } ],
"married" : true }
親トピック: 論理組合せ句(参考)
5.2.4 ネストされた条件句(参考)
QBEのネストされた条件句を使用して、複数の条件をオブジェクトである配列要素に同時に適用します。
ネストされた条件句は、parent
パスとその後に続くコロン(:
)および単一の空でないネストされたフィルタ条件で構成されます。
parent : filter-condition
このパスは、ネストされた条件を満たす子オブジェクトである値を持つ親オブジェクトをターゲットとします。parent
パスが[*]
で終了する場合、そのような子オブジェクトであるか、またはその要素の少なくとも1つであるオブジェクトを含む配列である値を持つ親オブジェクトをターゲットとします。後者は一般的なケースです。[*]
でparent
パスを終了します。
ネストされた条件に含まれているすべてのフィールドが、親オブジェクトを対象としています。各配列オブジェクト(または親の値が配列でない場合は、単一の子オブジェクト)に対する複数の条件として機能します。
ノート:
ネストされた条件句の条件の後にフィールドが続くので、ID句または特殊な基準句を含むことはできません。これらの句はルート・レベルでのみ発生する可能性があります。
たとえば、フィールドaddress
に、フィールドcity
とstate
を持つオブジェクト要素を含む配列値があるとします。次のネストされた条件句は、配列address
に、"Boston"
値を持つフィールドaddress.city
および"MA"
値を持つフィールドaddress.state
の両方を持つ1つ以上のオブジェクトがあるかどうかをテストします。
"address[*]" : { "city" : "Boston", "state" : "MA" }
同様に、次のネストされた条件句は、address.city
の値がBos
で始まり、address.state
に"MA"
の値が含まれているかどうかをテストします。
"address[*]" : { "city" : { "$startsWith : "Bos" }, "state" : "MA" }
ここでは、次のドキュメントがあるとします。
{ "address" : [ { "city" : "Boston", "state" : "MA" },
{ "city" : "Los Angeles", "state" : "CA" } ] }
前述のネストされた条件句の両方がこのドキュメントと一致します。
また、address
フィールド値がオブジェクトの配列ではなく、オブジェクトである次のドキュメントにも一致します。配列の場合を処理するには、ネストされた条件句内に[*]
が必要ですが、単一オブジェクトの場合もこれで処理されます。
{ "address" : { "city" : "Boston", "state" : "MA" } }
誤って[*]
を省略した場合は、配列の各オブジェクト要素が指定された複数の条件に対して個別に照合されます。
たとえば、次の2つの問合せは等価です。最初の問合せは、ネストされた条件句の形式ですが、[*]
がありません。これらの問合せは、ドキュメント内の各address
を個別に照合します。address
配列の各オブジェクト要素を照合して、city
の値が"Boston"
であるか、またはstate
の値が"CA"
であるかを確認します。両方の値を持つ場合もありますが、その必要はありません。したがって、これらの各問合せは、前述のドキュメントと一致します。このドキュメントには、city "Boston"
およびstate "CA"
の両方を含む単一オブジェクトが存在しません。
{ "address" : { "city": "Boston", "state" : "CA" } }
{ "address.city" : "Boston", "address.state" : "CA" }
親フィールドaddress
にネストされた条件句を持つ次の問合せでは、配列であるaddress
値を持つ前述のドキュメントと一致しません。このドキュメントには、"Boston"
の値を持つフィールドcity
および"CA"
の値を持つフィールドstate
の両方を含む配列の単一オブジェクトが存在しないためです。
{ "address[*]" : { "city" : "Boston", "state" : "CA" } }
関連トピック
親トピック: フィルタ条件(参考)
5.2.5 ID句(参考)
通常、他の例による問合せ(QBE)の演算子はドキュメントのコンテンツ内で特定のJSONフィールドを検索し、その値を照合しようとします。ID句は、演算子$id
を使用し、かわりにドキュメント・キーを照合します。したがって、ドキュメントのコンテンツではなくドキュメントのメタデータを照合します。
演算子$id
は、SODA for JavaまたはSODA for RESTによって、異種コレクション(メディア・タイプ列を含むコレクション)での使用がサポートされていません。
ドキュメント・キーが指定されたドキュメントを一意に識別します。作成時のタイムスタンプ、最終変更のタイムスタンプおよびバージョンなどのメタデータです。全体としてドキュメントに付属しているものですが、ドキュメント・コンテンツの一部ではありません。
ID句の構文は、QBE演算子$id
の後にスカラー・キー(ドキュメントID)または空でない配列のスカラー・キーが続きます。脚注12スカラー・キーは整数または文字列である必要があります。配列要素は、すべて整数か、またはすべて文字列のいずれかでなければなりません。次に例を示します。
"$id" : "USA"
"$id" : [1001,1002,1003]
特殊基準句またはtext-contains句と同様に、演算子$id
は、QBEの最も外側の条件、つまり複合フィルタまたはフィルタ条件フィルタで使用される条件でのみ使用できます。
ID句は、$and
句内の他の句と組み合せることができます。1つのID句のみを同じQBE内の他の句と組み合せることができます。
例5-3 最も外側のQBE条件における演算子$idの使用
これらの同等のQBEはそれぞれ、キーkey1
およびkey2
の少なくとも1つを持ち、値が"red"
のcolor
フィールドを持つドキュメントを見つけます。(最初のQBEでは、演算子$and
は暗黙的です。)
{ "$id" : [ "key1", "key2" ], "color" : "red" }
{ "$and" : [ { "$id" : [ "key1", "key2" ] }, { "color" : "red" } ] }
{ "$and" : [ { "$id" : [ "key1", "key2" ], "color" : "red" } ] }
関連トピック
親トピック: フィルタ条件(参考)
5.2.6 text-contains句(参考)
text-contains句は、全文検索パターン$textcontains:pattern
として使用される文字列値を持つ演算子$textContains
です。ドキュメントの一部のテキストがそのパターンと一致する場合にのみ、非JSONドキュメントと一致します。一致はOracle Textの全文一致です。
(演算子$textContains
は、SODA for JavaまたはSODA for RESTではサポートされません。)
Oracle Textテクノロジが、SODA演算子$textContains
の基礎となっています。これは、たとえば、他のテキストの近くにあるテキストを問い合せたり、問合せでファジー・パターン・マッチングを使用できることを意味します。演算子$textContains
はSQL関数contains
のように機能し、検索パターンの構文は同じです。
$textContains
で全文検索を使用するには、まず、検索する異種コレクションのOracle Text検索索引を作成する必要があります。(これを行う方法の例は、QBE演算子$textContainsの概要を参照してください。)
text-contains句は、QBEの最も外側の条件(唯一のトップレベルのフィルタ条件または問合せ句($query
)の唯一の条件)でのみ使用できます。いずれの場合も、条件には1つのtext-contains句のみを使用できます。
次に、text-contains句を含む一般的なフィルタ条件を示します。
{ "$textContains" : "beth" }
$textContains
を$id
とともに使用して、特定のドキュメントのみを検索できます。たとえば、次の(同等の)例では、キー1001、1002および1003を持つドキュメントが検索されます。
{ "$textContains" : "beth", "$id" : [1001,1002,1003] }
{ "$and" : [ { "$textContains" : "beth" }, { "$id" : [1001,1002,1003] } ] }
ID以外の句とともにtext-contains句を使用することはできません。たとえば、次は使用できません。
-
{ "$textcontains" : "beth", "age" : 42 }
-
{ "$and" [ { "$textcontains" : "beth" }, { "age" : 42 } ] }
関連項目:
-
Oracle Text演算子
contains
(検索パターン構文を含む)の詳細は、Oracle Textリファレンスを参照してください -
SQL関数
contains
の検索パターンでの特殊文字の使用の詳細は、Oracle Textリファレンスを参照してください -
Oracle Text検索で予約されている単語および文字の詳細は、Oracle Textリファレンスを参照してください。また、それらのエスケープ方法は、Oracle Textリファレンスを参照してください。
親トピック: フィルタ条件(参考)
5.2.7 特殊基準句(参考)
特殊基準句は、空間句(演算子$near
、$intersects
または$within
)、またはcontains句(演算子$contains
)です。
ID句またはtext-contains句と同様に、特殊基準句はQBEの最も外側の条件でのみ、つまり複合フィルタまたはフィルタ条件フィルタで使用される条件でのみ使用できます。
より正確に言うと、QBEで他の演算子と特殊基準句を使用する場合、最も外部条件は演算子$and
であり、特殊基準句はその$and
に対する配列引数内の要素のメンバーである必要があります。
- 空間句(参考)
GeoJSONオブジェクトは、地理的データを表すJSONオブジェクトです。SODA QBE空間句を使用して、ドキュメントでGeoJSONジオメトリ・オブジェクトを照合できます。 - contains句(参考)
contains句は、1つの$contains
演算子を含むオブジェクトが後に続くフィールドであり、その値は文字列です。フィールド値の文字列または数値が、配列要素を含むどこかの文字列オペランドと一致する場合にのみ、JSONドキュメントと一致します。一致はOracle Textの全文です。
関連トピック
親トピック: フィルタ条件(参考)
5.2.7.1 空間句(参考)
GeoJSONオブジェクトは、地理的データを表すJSONオブジェクトです。SODA QBE空間句を使用して、ドキュメントでGeoJSONジオメトリ・オブジェクトを照合できます。
ノート:
QBE空間演算子を使用するには、Oracle Databaseリリース12c (12.2.0.1)以上が必要です。
空間QBE句は、フィールドの後に空間演算子($near
、$intersects
または$within
)が続くフィールドです。指定した位置に近いか、指定したジオメトリ・オブジェクトに交差する、または指定されたジオメトリ・オブジェクト内にあるGeoJSON地理データを含んでいる場合にのみ、フィールドに一致します。
各空間QBE演算子の後には、フィールドに$geometry
を含める必要があるJSONオブジェクトが続きます。演算子$near
にはフィールド$distance
も必要で、$unit
を含めることができます。$geometry
がないか、演算子$intersects
または$within
に$distance
または$unit
が指定されている場合には、コンパイル時エラーが発生します。
フィールド$geometry
の値は、点やポリゴンなどのGeoJSONジオメトリ・オブジェクト(ジオメトリ・コレクション以外)として解釈されます。このようなオブジェクトは、ジオメトリ・タイプとともに、"Point"
または"Polygon"
などの値をとるtype
フィールドと、オブジェクトの形状と場所をそれぞれ定義するcoordinates
フィールドを持ちます。
(たとえば、"Point"
タイプのオブジェクトなど、1つの位置の場合、フィールドcoordinates
は数値の配列であり、通常は最初の3つが経度、緯度および高度を表します。)
フィールド$distance
の値は正の数である必要があります。これが、空間演算子$near
の前のフィールドから、$geometry
で指定されるジオメトリ・オブジェクトまでの距離です。線やポリゴンなどポイント以外のジオメトリ・オブジェクトの場合、距離はそれらの間の最短距離です。そのため、2つの隣接したポリゴン間の距離は0(ゼロ)です。
フィールド$unit
の値は、$distance
値に使用するGeoJSON単位を指定する、"mile"
などの文字列です。使用可能な単位は、データベース表SDO_UNITS_OF_MEASURE
に定義されています。デフォルトの単位は"mile"
です。
例5-4 空間句を使用したQBE
この例は、値がPoint
タイプのGeoJSONジオメトリ・オブジェクトであり、座標[-122.417, 37.783]
(San Francisco, California)から60マイル以内のlocation
フィールドに一致します。これは、"location"
値[-122.236, 37.483]
(Redwood City, California)のデータと一致します。(配列"coordinates"
の最初の要素は経度、2番目の要素は緯度です。)
{"location" : { "$near" : { "$geometry" : { "type" : "Point",
"coordinates" :
[-122.417, 37.783] },
"$distance" : 60,
"$unit" : "mile" } } }
QBE空間句に対するデフォルトのエラー処理動作では、ターゲット・フィールドの存在が必須ではなく、存在する場合、その値は単一のGeoJSON geometry
オブジェクトである必要があります。一致したドキュメントについて、そうでない場合には問合せ時にエラーが発生します。脚注13
空間句では、デフォルトとは異なるエラー処理動作を指定できます。そのためには、空間演算子($near
、$within
、$intersects
)が適用されるオブジェクトでtrue
値を指定した次のブール・フィールドのいずれかを含めます。(true
として指定できるのは、エラー処理フィールドの1つのみです。そうしないと、問合せ時に構文エラーが発生します。)
ノート:
値がGeoJSON geometry
オブジェクトであるフィールドに対してSODA空間索引を作成しており、そのフィールドをターゲットとするQBEを使用するとき、索引とQBEの両方がそのフィールドに対して同じエラー処理動作を指定している場合には、QBEに対してのみの索引を選択できます。どちらにも、次のうち同じものを指定する必要があります。
-
scalarRequired : true
-
lax : true
-
scalarRequired : true
もlax : true
も指定しない
関連トピック
関連項目:
-
GeoJSONデータとOracle Spatial and Graphを連携して使用する方法の詳細は、Oracle Spatial開発者ガイドを参照してください
-
Oracle Spatial and Graphと
SDO_GEOMETRY
オブジェクト型の詳細は、Oracle Spatial開発者ガイドを参照してください -
GeoJSONの詳細は、GeoJSON.orgを参照してください
-
GeoJSONデータの詳細は、『The GeoJSON Format Specification』を参照してください
-
SQL/JSON関数でGeoJSON地理データを使用する方法の詳細は、Oracle Database JSON開発者ガイドを参照してください
親トピック: 特殊基準句(参考)
5.2.7.2 contains句(参考)
contains句は、1つの$contains
演算子を含むオブジェクトが後に続くフィールドであり、その値は文字列です。フィールド値の文字列または数値が、配列要素を含むどこかの文字列オペランドと一致する場合にのみ、JSONドキュメントと一致します。一致はOracle Textの全文です。
文字列オペランドは、配列要素も含めて、フィールド値の文字列と数値に対して完全な単語または数値として一致します。
たとえば、$contains
オペランド"beth"
は文字列"Beth Smith"
に一致しますが、文字列"Elizabeth Smith"
とは一致しません。オペランド"10"
は数値10
または文字列"10 Main Street"
と一致しますが、数値110
または文字列"102 Main Street"
とは一致しません。
ノート:
演算子$contains
を使用するには、Oracle Databaseリリース12c (12.2.0.1)以上が必要です。
Oracle Textテクノロジが、SODAのQBE演算子$contains
の基礎となっています。これは、たとえば、他のテキストの近くにあるテキストを問い合せたり、問合せでファジー・パターン・マッチングを使用できることを意味します。
SODA QBEのcontains句の動作の詳細は、SQL条件json_textcontains
のOracle Databaseドキュメントを参照してください。
演算子$contains
を使用できるようにするには、まず、JSON検索索引を作成する必要があります。そうしないと、$contains
を使用するQBEでSQLエラーが発生します。
contains句は、QBEの最も外側の条件でのみ使用できます。フィールドが異なるという条件で(QBE内のオブジェクトが重複フィールドを持つことはできません)、最上位レベルに複数のcontains句を含めることができます。
たとえば、次のQBEでは、単語"beth"
(大/小文字の区別なし)を含む"name"
フィールドおよび数値10
または文字列"10"
を含む"address"
フィールドについてチェックされます。
{ "name" : { "$contains" : "beth" },
"address" : { "$contains" : "10" } }
同じフィールドに対する複数のcontains句の効果を及ぼす(同じフィールドで複数の単語または数字のパターンを検索する)には、最も外側の条件に演算子$and
が必要であり、contains句はその$and
に対する配列引数のオブジェクト要素内にある必要があります。
たとえば、次のQBEでは、単語"street"
および数値10
または単語"10"
のいずれかの両方を含む"address"
フィールドがチェックされます。
{"$and" : [ { "address" : { "$contains" : "street" } },
{ "address" : { "$contains" : "10" } } ] }
関連項目:
-
SQL条件
json_textcontains
の参照情報は、Oracle Database SQL言語リファレンスを参照してください。 -
SQL条件
json_textcontains
を使用したJSONドキュメントの全文検索の詳細は、Oracle Database JSON開発者ガイドを参照
親トピック: 特殊基準句(参考)
脚注凡例
脚注1:QBE演算子への引数が必要なタイプではない場合(たとえば、演算子$gt
に文字列または数値以外の引数が渡された場合)、構文エラーが発生します。
脚注2: SODA for RESTには、複合フィルタで使用するための句がさらに用意されています。
脚注3: デフォルトのエラー処理動作は、SQL/JSONセマンティクス
ERROR ON ERROR NULL ON EMPTY
に相当します。脚注4:
$scalarRequired
のtrue
値は、json_value
式のSQL句ERROR ON ERROR
の使用に相当します。脚注5:
$lax
のtrue
値は、json_value
式で作成されたファンクション索引に対するSQL句NULL ON ERROR
の使用に相当します。脚注7:
注意: JSONスカラーはオブジェクトまたは配列以外の値であり、JSON数値、文字列、true、falseまたはnullです。
脚注8: 多くても1つのnot句がオペランドに許されます。
脚注12:
配列に少なくとも1つの要素が含まれていない場合、構文エラーが発生します。
脚注13: デフォルトのエラー処理動作は、
json_value
にSQL句ERROR ON ERROR
およびNULL ON EMPTY
を使用することに相当します。脚注14:
$scalarRequired
のtrue
値は、json_value
式にSQL句ERROR ON ERROR
を使用することに相当します。脚注15:
$lax
のtrue
値は、json_value
式で作成する関数索引にSQL句NULL ON ERROR
を使用することに対応します。