値比較演算子

構文

comparison_expression ::= concatenate_expression 
   [(value_comparison_operator | any_comparison_operator) add_expression]

value_comparison_operator ::= "=" | "!=" | ">" | ">=" | "<" | "<="

セマンティクス

値比較演算子は、主に2つの値を比較するために使用されます。1つは左オペランド、もう1つは右オペランドから生成された値です(これは、次の項で定義されている、2つの値順序を比較する順序比較とは異なります)。オペランドが複数の項目を返した場合、エラーが発生します。両方のオペランドが空の順序を返した場合、オペランドは等しいとみなされます(したがって、演算子が=、<=、>=の場合はtrueが返されます)。オペランドの1つのみが空白を返した場合、演算子が!=でないかぎり、比較結果はfalseになります。

この項の残りの部分では、各オペランドが1つの項目のみを返すことを前提としています。オペランドがNULLを返した場合、比較式の結果もNULLになります。それ以外の場合、結果はブール値で、次のように計算されます。

アトミック項目間で項目の型を比較できない場合は、falseが返されます。次のルールでは、比較可能なアトミック型およびそれぞれの型における比較方法を定義しています。
  • 数値項目は、他の数値項目と比較できます。整数値またはlong値がfloat値またはdouble値と比較される場合、最初に整数/longがfloat/doubleにキャストされます。オペランドの1つが数値である場合、もう1つのオペランドが最初に数値にキャストされます(まだ数値でない場合)。
  • 文字列項目は、別の文字列項目と比較できます(java String.compareTo()メソッドを使用)。文字列項目は列挙項目とも比較できます。この場合、比較前に、文字列が他の列挙項目の型の列挙項目にキャストされます。このようなキャストは、列挙型に文字列値がソース文字列と等しいトークンが含まれる場合のみ可能です。キャストが成功すると、次に説明するように、2つの列挙項目が比較されます。それ以外の場合、2つの項目は比較できず、falseが返されます。
  • 2つの列挙項目は、同じ型に属している場合にのみ比較できます。その場合、比較は(文字列値ではなく) 2つの列挙の序数で行われます。前述のように、列挙項目は、文字列を列挙項目にキャストすることで、文字列項目とも比較できます。
  • バイナリ項目と固定バイナリ項目は、等価性についてのみ相互に比較できます。2つの値は、バイト順序の長さが同じであり、バイト単位で等しい場合に等しくなります。
  • ブール項目は、java Boolean.compareTo()メソッドを使用して、他のブール項目と比較できます。
  • タイムスタンプ項目は、精度が異なる場合でも、別のタイムスタンプ項目と比較できます。
  • JNULL (JSON NULL)はJNULLと比較できます。比較演算子が!=である場合、JNULLはその他すべての種類の項目とも比較でき、その他の項目もJNULLである場合を除いて、このような比較の結果は常にtrueになります。
複合項目間の比較のセマンティクスは、再帰的に定義されています。具体的には、次のとおりです。
  • レコードは、等価性についてのみ、かつ比較可能な値が含まれている場合にのみ別のレコードと比較できます。具体的には、2つのレコードが等しくなるには、サイズ(フィールド数)が同じである必要があり、最初のレコードの各フィールドに対して、もう一方のレコードにフィールドが存在し、2つのフィールドがそれらが含まれているレコード内で同じ位置にあり、同じフィールド名と同じ値を持っている必要があります。
  • マップは、等価性についてのみ、かつ比較可能な値が含まれている場合にのみ別のマップと比較できます。JSONドキュメントはマップとしてモデル化されるため、2つのJSONドキュメントは等価性について比較できます。具体的には、2つのマップが等しくなるには、サイズ(フィールド数)が同じである必要があり、最初のマップの各フィールドに対して、もう一方のマップにフィールドが存在し、2つのフィールドが同じ名前と同じ値を持っている必要があります。
  • 配列は、2つの配列の要素がペアごとに比較可能な場合に別の配列と比較できます。2つの配列間の比較は辞書順に行われます。つまり、配列は文字列のように、比較する文字の役割をする配列要素と比較されます。

アトミック項目と同様に、前述のルールに従って2つの複合項目を比較できない場合は、falseが返されます。また、アトミック項目と複合項目の比較では、常にfalseが返されます。

比較できない項目についてエラーが発生せずfalseが返される理由は、異なる表の行にまったく異なるデータや形の異なるデータが含まれる可能性がある真のスキーマレス・アプリケーションを処理するためです。そのため、問合せの作成者でも、オペランドが返すことができる項目の種類は不明であり、オペランドは実際に異なる行から異なる種類の項目を返すことがあります。しかし、問合せ作成者が何かをたとえば整数と比較する場合、何かが整数であると想定し、一部の行がその想定を満たしていないために問合せ全体を拒否するのではなく、想定を満たす表の行から結果を確認することを望みます。

例6-34 値比較演算子

アトミック項目間の比較の例はすでに示しました。ここでは、2つの配列間の比較を行う例を示します。

ユーザー3、20および10のみとこの順序どおりに接続しているユーザーのidおよびlastNameを選択します。この例では、配列コンストラクタ(配列およびマップ・コンストラクタを参照)を使用して、値3、20および10をこの順序で含む配列を作成します。

SELECT id, lastName FROM users
WHERE connections = [3, 20, 10];