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)下位レベルで複合フィルタの問合せ句で使用することもできます。

注意:

例による問合せは、異種コレクション(メディア・タイプ列を含むコレクション)ではサポートされていません。このようなコレクションは、JSONとJSON以外の両方のコンテンツの格納用に設計されています。QBEはJSONドキュメントのみを含むコレクションに対してのみサポートされます。

関連項目:

厳密なJSON構文および緩慢なJSON構文の詳細は、Oracle Database JSON開発者ガイドを参照

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 } }

関連トピック

5.1.1 Orderby句による選択したオブジェクトのソート

orderby句を含むフィルタ仕様(例による問合せ、QBE)では選択したJSONドキュメントをソートして返します。

順序指定を制御する方法は2通りあり、orderby句の構文が異なります。

  • 配列構文を使用すると、使用されるSQLデータ型を指定し、フィールドの順序を簡単に制御できます。ソートは、まず指定された最初のフィールドで、次に2番目のフィールドで、というように行われます。

    この構文には、エラーまたは空のフィールドを処理するデフォルトの動作を変更する必要があるかどうかに応じて、2つの種類があります。

  • 省略構文では、使用するSQLデータ型を指定できません。最も省略した形では、ソートに使用されるフィールドの順序も制御されません。

orderby句の配列構文

最も単純なorderby配列構文は、演算子$orderbyの後に、オブジェクトの配列が続きます。各オブジェクトには、候補オブジェクトのルートから特定のフィールドをターゲット指定するpathフィールドがあり、次に各フィールドのそれぞれを次に1つ指定します。

  • datatypeには、使用するSQLデータ型を指定します。"varchar2" (デフォルト)、"number""date""timestamp""string""varchar"のいずれかです。(値"string"および"varchar"は、"varchar2"のシノニムです。)

    これらの値は、それぞれSQLデータ型VARCHAR2NUMBERDATEおよびTIMESTAMPに対応します。

    注意:

    dateまたはtimestampdatatype値を使用するには、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 - ブール値。オプションです。ターゲット・フィールドが存在し、その値はdatatypeデータ型に変換可能なJSONスカラーである必要があります。一致したドキュメントについて、そうでない場合には問合せ時にエラーが発生します。脚注4

  • $lax — ブール値。オプションです。ターゲット・フィールドが存在する必要も、その値がdatatypeデータ型に変換可能なJSONスカラーである必要もありません。一致したドキュメントについて、そうでない場合でも問合せ時にエラーは発生しません。脚注5

たとえば、このフィルタ仕様の動作は前述の動作と同じですが、ターゲット・フィールドのいずれかが欠落している場合にはエラーが発生します。

{ "$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ツリー索引を定義している場合、その問合せで取得されるには、indexNullstrueに設定して索引を指定する必要があります。

関連項目:

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句

  • 特殊基準句

フィルタ条件は、そのすべての句がtrueの場合にのみtrueになります。フィルタ条件は(空のオブジェクト{})でもかまいません。この場合、すべての(ゼロ)句は空になります(フィルタ条件が満たされます)。

たとえば、QBEにフィルタ条件が1つしかなく、空の場合、コレクションのすべてのドキュメントが選択されます。この場合、検索操作はすべてのドキュメントを返し、削除操作はそれらをすべて削除します。

5.2.1 スカラー等価句(参考)

スカラー等価句は、指定したオブジェクト・フィールドが指定したスカラー値と等しいかどうかをテストします。

スカラー等価句は、スカラー値を持つオブジェクト・メンバーです。これは、フィールドの値がスカラーに等しいかどうかをテストします。

field : scalar

(注意: JSONスカラーはオブジェクトまたは配列以外の値であり、JSON数値、文字列、truefalseまたはnullです。)

スカラー等価句は、フィールド条件句と同じ動作で、演算子$eqを使用して同じフィールド値をテストする比較句を持っています。つまり、field : scalarfield : { "$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"と等しいかどうかがテストされ、このテストが失敗するためです。

5.2.2.1 比較句(参考)

比較句は、そのフィールドが比較演算子であるオブジェクト・メンバーです。例:"$gt" : 200

表5-1比較演算子について説明しています。「説明」列の例で使用されているドキュメントについては、サンプルJSONドキュメントを参照してください。

表5-1 例による問合せ(QBE)の比較演算子

演算子 説明

$exists

フィールドが存在するかどうかをテストします。次のいずれかの場合にドキュメントと一致します。

  • フィールドが存在し、オペランドがtrueを表しています。つまり、falsenull0以外のスカラー値であることを意味します。

  • フィールドが存在せず、オペランドがfalseを表しています。つまり、falsenullまたは0であることを意味します。

オペランド

JSONスカラー。

{drinks : { "$exists" : true }}

サンプル・ドキュメント3と一致します。

{drinks : { "$exists" : false }}

サンプル・ドキュメント1および2と一致します。

$eq

フィールドの値がオペランドの値と等しい場合にのみ、ドキュメントと一致します。

オペランド

JSONスカラー。

{"name" : { "$eq" : "Jason" }}

サンプル・ドキュメント1と一致します。

$ne

フィールドの値がオペランドの値と等しくないか、ドキュメント内にこのようなフィールドがない場合にのみ、ドキュメントと一致します。

オペランド

JSONスカラー。

{"name" : { "$ne" : "Jason" }}

サンプル・ドキュメント2および3と一致します。

$gt

フィールドの値がオペランドの値より大きい場合にのみ、ドキュメントと一致します。

オペランド

JSON数値または文字列。

{"age" : { "$gt" : 50 }}

サンプル・ドキュメント2と一致します。

$lt

フィールドの値がオペランドの値より小さい場合にのみ、ドキュメントと一致します。

オペランド

JSON数値または文字列。

{"age" : { "$lt" : 50 }}

サンプル・ドキュメント1と一致します。

$gte

フィールドの値がオペランドの値以上の場合にのみ、ドキュメントと一致します。

オペランド

JSON数値または文字列。

{"age" : { "$gte" : 45 }}

サンプル・ドキュメント1、2および3と一致します。

$lte

フィールドの値がオペランドの値以下の場合にのみ、ドキュメントと一致します。

オペランド

JSON数値または文字列。

{"age" : { "$lte" : 45 }}

サンプル・ドキュメント1と一致します。

$between

文字列または数値フィールド値が2つのオペランド配列要素の間にあるか、またはそれらのいずれかと等しい場合にのみ、ドキュメントと一致します。

オペランド

2つのスカラー要素のJSON配列。最初は2つのうち小さい方である必要があります。(文字列値の場合、辞書順で小さいほうが最初)。

要素のうち多くて1つをnullにできます。つまり、制限はありません。両方がnullの場合、または厳密に2つの配列要素がない場合は、エラーが発生します。

{"age" : { "$between" : [49, 70] }}

サンプル・ドキュメント2および3と一致します。

{"age" : { "$between" : [45, null] }}

サンプル・ドキュメント1、2および3と一致します。これは次と同等です。

{"age" : { "$gte" : 45 }}

$startsWith

フィールドの値がオペランドの値で始まる場合にのみ、ドキュメントと一致します。

オペランド

JSON文字列。

{"name" : {"$startsWith" : "J"}}

サンプル・ドキュメント1と一致します。

$hasSubstringまたは$instr

フィールド値がオペランドと等しい部分文字列の文字列である場合にのみ、ドキュメントと一致します。

オペランド

空でないJSON文字列。

{"street" : { "$hasSubstring" : "street" }}

サンプル・ドキュメント1および2と一致します。

$regex

フィールドの値がオペランドの正規表現と一致する場合にのみ、ドキュメントと一致します。

オペランド

JSON文字列としてSQL正規表現。

『Oracle Database SQL言語リファレンス』を参照してください。

{"name" : { "$regex" : ".*son"}}

サンプル・ドキュメント1と一致します。

$like

フィールド値がオペランド・パターンと一致する場合にのみ、ドキュメントと一致します。

オペランド

JSON文字列としてのSQL LIKE条件パターン。

『Oracle Database SQL言語リファレンス』を参照してください。

{"city" : { "$like" : "Mar_" }}

サンプル・ドキュメント2および3と一致します。

$in

フィールドが存在し、その値がオペランド配列の少なくとも1つの値と等しい場合にのみ、ドキュメントと一致します。

オペランド

空ではない、スカラーのJSON配列。脚注6

{"address.zip" : { "$in" : [ 94088, 90001 ] }}

サンプル・ドキュメント1および2と一致します。

$nin

次のうちのいずれかがtrueとなるドキュメントを見つけます。

  • フィールドは存在しますが、その値がオペランド配列のどの値とも等しくありません。

  • フィールドが存在しない。

オペランド

空ではない、スカラーのJSON配列。脚注6

{"address.zip" : { "$nin" : [ 90001 ] }}

サンプル・ドキュメント1および2と一致します。

$all

次のうちのいずれかがtrueとなるドキュメントを見つけます。

  • フィールド値が、オペランド配列のすべての値を含む配列です。

  • フィールド値がスカラー値で、オペランド配列には一致する単一の値が含まれています。

オペランド

空ではない、スカラーのJSON配列。脚注6

{"drinks" : { "$all" : ["soda", "tea"]}}

サンプル・ドキュメント2と一致します。

{"drinks": { "$all" : ["tea"]}}

サンプル・ドキュメント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

$abs

対象となるJSON数値の絶対値。

演算子のターゲット

JSON数値

{"ordinate" : {"$abs" : {"$gt" : 1.0}}}は、大きさが1.0より大きい負または正のordinate値と一致します。これは、たとえば、–1.3および1.3と一致します。

$boolean

対象となるJSON値のブール型の解釈。

演算子のターゲット

JSONブール値(trueまたはfalse)または小文字に変換された場合に"true"または"false"のいずれかである文字列

{"retired" : {"$boolean" : true}}は、trueretired値または大/小文字を区別せずに"true"と一致する文字列と(のみ)一致します。

$ceiling

最も近い整数に切り上げられた対象となるJSON数値。

演算子のターゲット

JSON数値

{"age" : {"$ceiling" : {"$lt" : 65}}}は、63.9age値と一致します。64.1の値とは一致しません。64.1は65に切り上げられるためです。

$date脚注10

対象となるJSON文字列の日付解釈。

演算子のターゲット

サポートされているISO 8601形式のJSON文字列

{"birthday" : {"$date" : "2018–06–30"}}は、"2018–06–30"または"2018–06–30T17:29:08Z""birthday"値と一致します。同じ日付に対してサポートされているISO 8601形式であるためです。

$double

対象となるJSON数値または数値文字列値のSQL BINARY_DOUBLE解釈。

演算子のターゲット

JSON数値または数値文字列

{"thickness" : {"$double" : {"$lt" : 1.0}}}は、"0.999999999"thickness値と一致します。

$floor

最も近い整数に切り下げられた対象となるJSON数値。

演算子のターゲット

JSON数値

{"age" : {"$floor" : {"$le" : 65}}}は、65.2age値と一致します。66.3の値とは一致しません。66.3は66に切り下げられるためです。

$length

対象となるJSON文字列内の文字数。

演算子のターゲット

JSON文字列

{"name" : {"$length" : {"$gt" : 4}}}は、"Jason"と一致します。"Mary"とは、その文字列が4文字しかないため一致しません。

$lower

対象となるJSON文字列内の文字に対応する小文字の文字列。

演算子のターゲット

JSON文字列

{"name" : {"$lower" : "mary"}}は、"Mary"と一致します。

$number

対象となるJSON数値または数値文字列値のSQL NUMBER解釈。

$numberの使用は、数値定数の指定と同等です。

演算子のターゲット

JSON数値または数値文字列

{"thickness" : {"$number" : {"$lt" : 1.0}}}は、"0.9999"thickness値と一致します。

{"thickness" : {"$number" : {"$lt" : 1.0}}}は、{"thickness" : {"$lt" : 1.0}}と同等です。

$size

配列内の要素の数、スカラーまたはオブジェクトの場合は1。

演算子のターゲット

任意の種類のJSON値

値が複数の要素を持つ配列であるため、{"drinks" : {"$size" : {"$gt" : 1}}}は、drinks値の["soda", "coffee"]と一致します。

{"address" : {"$size" : 1}}は、JSONオブジェクトであるaddress値と一致します。

$string

対象となるJSONスカラーのSQL VARCHAR2(4000)解釈。

$stringの使用と文字列定数(リテラル)の指定は同等です。

演算子のターゲット

null以外のJSONスカラー

{"age" : {"$string" : {"$lt" : "45"}}}は、100の数値age値と一致します。文字列"100"が辞書順で文字列"45"より小さいためです。

{"age" : {"$string" : {"$lt" : "45"}}}は、{"age" : {"$lt" : "45"}}と同等です。

$timestamp脚注11

対象となるJSON文字列の日時解釈。

演算子のターゲット

サポートされているISO 8601形式のJSON文字列

{"meeting—time" : {"$timestamp" : VALUE}}は、VALUEが次のいずれかの場合に同じ値と一致します。

  • "2016-07-26T02:06:01Z"

  • "2016-07-26T02:06:01"(デフォルトではUTC)

  • "2016-07-26T01:06:01-01:00" (UTCから1時間遅れのタイムゾーンの午前1:00は2:00 am UTCと同等です。)

VALUEが日付のみのISO 8601文字列である場合、それに相当する日時値が使用されます。たとえば、"2016-07-26"の日付値は、タイムゾーン付き日付値"2016-07-26T00:00:00Z"として扱われます。

$type

対象となるデータのJSONデータ型の名前。小文字のJSON文字列です。

  • nullの値の場合は"null"です。

  • trueまたはfalseの値の場合は"boolean"です。

  • 数値の場合は"number"

  • 文字列の場合は"string"

  • 配列の場合は"array"

  • オブジェクトの場合は"object"

演算子のターゲット

任意の種類のJSON値

{"address" : {"$type" : "object"}}は、JSONオブジェクトであるaddress値と一致します。

$upper

対象となるJSON文字列内の文字に対応する大文字の文字列。

演算子のターゲット

JSON文字列

{"name" : {"$upper" : "MARY"}}"Mary"と一致します。

脚注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では、ISO 8601の日付および時刻形式の多くがサポートされています。

国際標準化機構(ISO)標準8601には、国際的に認められた日付と時刻の表現方法が記載されています。最も一般的なISO 8601日時形式の文字列を、適切なOracle Databaseの日付と時刻の値として操作できます。サポートされているISO 8601形式は、基本的に数字のみ、言語に中立で曖昧さのないものです。

これは、日付と時刻に許可されている構文です。

  • 日付(のみ):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進数(秒の小数部を表す)を続けて指定します。

  • ZUTC時間(タイムゾーン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 (年が完全に指定されていません)

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"}]} ]
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で、かつmarriedtrueのオブジェクトを指定します。

$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 ネストされた条件句(参考)

ネストされた条件句は、親フィールドとその後に続く単一の空でないフィルタ条件から構成されます。このネストされた条件句に含まれているすべてのフィールドが、親フィールドを対象としています。

parent_field : filter-condition

注意:

ネストされた条件句の条件の後にフィールドが続くので、ID句または特殊な基準句を含むことはできません。これらの句はルート・レベルでのみ発生する可能性があります。

たとえば、フィールドaddressに子フィールドのcitystateがあるとします。次のネストされた条件句は、address.cityフィールドに値"Boston"が含まれ、address.state"MA"の値が含まれているかどうかをテストします。

"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配列の各オブジェクト要素を個別に照合して、cityの値が"Boston"であるか、またはstateの値が"CA"であるかを確認します。

{ "address.city" : "Boston", "address.state" : "CA" }

この問合せはネストされた条件がないため、cityが"Boston"でstateが"CA"単一オブジェクトのない、前述のドキュメントと一致します。

親フィールドaddressにネストされた条件を持つ次の問合せでは、前述のドキュメントと一致しません。このドキュメントには、"Boston"の値を持つフィールドcityおよび"CA"の値を持つフィールドstateの両方を含むaddress配列の単一オブジェクトが存在しないためです。

{ "address" : { "city" : "Boston", "state" : "CA" } }

5.2.5 ID句(参考)

通常、他の例による問合せ(QBE)の演算子はドキュメントのコンテンツ内で特定のJSONフィールドを検索し、その値を照合しようとします。ID句は、演算子$idを使用し、かわりにドキュメント・キーを照合します。したがって、ドキュメントのコンテンツではなくドキュメントのメタデータを照合します。

ドキュメント・キーが指定されたドキュメントを一意に識別します。作成時のタイムスタンプ、最終変更のタイムスタンプおよびバージョンなどのメタデータです。全体としてドキュメントに付属しているものですが、ドキュメント・コンテンツの一部ではありません。

ID句の構文は、QBE演算子$idの後にスカラー・キー(ドキュメントID)または空でない配列のスカラー・キーが続きます。脚注12スカラー・キーは整数または文字列である必要があります。配列要素は、すべて整数か、またはすべて文字列のいずれかでなければなりません。次に例を示します。

"$id" : "USA"
"$id" : [1001,1002,1003]

特殊基準句と同様に、演算子$idはQBEの最も外側の条件、つまり複合フィルタまたはフィルタ条件フィルタで使用される条件でのみ使用できます。より正確に言うと、QBEで他の演算子と$idも使用する場合、最も外側の条件は演算子$andであり、$id条件は1回のみ指定し、その$andの指定に対する配列引数の要素である必要があります。

例5-3に、これを示します。これは、少なくとも1つがキーkey1またはkey2を持ち、値が"red"colorフィールドを持つドキュメントを見つけます。

例5-3 最も外側のQBE条件における演算子$idの使用

{ "$and" : [ { $id : [ "key1", "key2" ] }, { "color" : "red" } ] }

5.2.6 特殊基準句(参考)

特殊基準句は、contains句(演算子$contains)または空間句(演算子$near$intersectsまたは$within)です。

ID句と同様に、特殊基準句はQBEの最も外側の条件でのみ、つまり複合フィルタで使用される条件またはフィルタ条件フィルタで使用できます。より正確に言うと、QBEで他の演算子と特殊基準句を使用する場合、最も外側の条件は演算子$andであり、特殊基準句はその$andの指定に対する配列引数の要素である必要があります。

関連トピック

5.2.6.1 contains句(参考)

contains句は、1つの$contains演算子を含むオブジェクトが後に続くフィールドであり、その値は文字列です。フィールド値の文字列または数値が、配列要素を含むどこかの文字列オペランドと一致する場合にのみ、ドキュメントと一致します。一致は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" } } } ] }

関連項目:

5.2.6.2 空間句(参考)

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つのみです。そうしないと、問合せ時に構文エラーが発生します。)

  • $scalarRequired - ブール値。オプションです。ターゲット・フィールドが存在し、その値としてGeoJSON geometryオブジェクトを持つ必要があります。一致したドキュメントについて、そうでない場合には問合せ時にエラーが発生します。脚注14

  • $lax — ブール値。オプションです。ターゲット・フィールドが存在する必要も、その値としてGeoJSON geometryオブジェクトを持つ必要もありません。一致したドキュメントについて、そうでない場合でも問合せ時にエラーは発生しません。脚注15

注意:

値がGeoJSON geometryオブジェクトであるフィールドに対してSODA空間索引を作成しており、そのフィールドをターゲットとするQBEを使用するとき、索引とQBEの両方がそのフィールドに対して同じエラー処理動作を指定している場合には、QBEに対してのみの索引を選択できます。どちらにも、次のうち同じものを指定する必要があります。

  • scalarRequired = true

  • lax = true

  • scalarRequired = trueでもlax = trueでもありません

関連項目:



脚注凡例

脚注1:

QBE演算子への引数が必要なタイプではない場合(たとえば、演算子$gtに文字列または数値以外の引数が渡された場合)、構文エラーが発生します。


脚注2: SODA for RESTでは、コンポジット・フィルタで使用する追加の句が提供されます。
脚注3: デフォルトのエラー処理動作は、SQL/JSONセマンティクスERROR ON ERROR NULL ON EMPTYに対応します。
脚注4: $scalarRequiredtrue値は、json_value式にSQL句ERROR ON ERRORを使用することに相当します。
脚注5: $laxtrue値は、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: $scalarRequiredtrue値は、json_value式にSQL句ERROR ON ERRORを使用することに相当します。
脚注15: $laxtrue値は、json_value式で作成する関数索引にSQL句NULL ON ERRORを使用することに対応します。