演算子は特殊文字やキーワードによって表されます。関数の呼び出し構文は使用しません。また、演算子は、オペランドとも呼ばれる任意の数のデータ入力を操作し、結果を返します。
一般的な慣例:
- 特記のない限り、オペランドの 1 つが
NULL
の場合、すべての演算子はNULL
を返します。 - 演算結果がオーバーフローした場合、すべての演算子は、エラーをスローします。
- 浮動小数点演算で、オペランドの 1 つが
+/-inf
またはNaN
の場合、+/-inf
またはNaN
が返されます。それ以外の場合には、エラーが返されます。
次の表には、すべての Cloud Spanner SQL 演算子を最も優先順位の高い方から最も低い方に、つまり、それらがステートメント内で評価される順序で表示しています。
優先順位 | 演算子 | 入力データ型 | 名前 | 演算子の項数 |
---|---|---|---|---|
1 | . | STRUCT |
メンバーのフィールド アクセス演算子 | 2 項 |
[ ] | ARRAY | 配列位置。OFFSET または ORDINAL とともに使用する必要があります。ARRAY 関数を参照。 | 2 項 | |
2 | + | すべての数値型 | 単項プラス | 単項 |
- | すべての数値型 | 単項マイナス | 単項 | |
~ | 整数または BYTES | ビット演算 NOT | 単項 | |
3 | * | すべての数値型 | 乗算 | 2 項 |
/ | すべての数値型 | 除算 | 2 項 | |
|| | STRING、BYTES、または ARRAY<T> | 連結演算子 | 2 項 | |
4 | + | すべての数値型 | 加算 | 2 項 |
- | すべての数値型 | 減算 | 2 項 | |
5 | << | 整数または BYTES | ビット演算左シフト | 2 項 |
>> | 整数または BYTES | ビット演算右シフト | 2 項 | |
6 | & | 整数または BYTES | ビット演算 AND | 2 項 |
7 | ^ | 整数または BYTES | ビット演算 XOR | 2 項 |
8 | | | 整数または BYTES | ビット演算 OR | 2 項 |
9(比較演算子) | = | 任意の比較可能型。全リストについてはデータ型を参照。 | 等しい | 2 項 |
< | 任意の比較可能型。全リストについてはデータ型を参照。 | より小さい | 2 項 | |
> | 任意の比較可能型。全リストについてはデータ型を参照。 | より大きい | 2 項 | |
<= | 任意の比較可能型。全リストについてはデータ型を参照。 | 次の値以下 | 2 項 | |
>= | 任意の比較可能型。全リストについてはデータ型を参照。 | 次の値以上 | 2 項 | |
!=, <> | 任意の比較可能型。全リストについてはデータ型を参照。 | 等しくない | 2 項 | |
[NOT] LIKE | STRING とバイト | 値が指定されたパターンと一致 [しない] | 2 項 | |
[NOT] BETWEEN | 互換性のある任意の型。全リストについてはデータ型を参照。 | 値が指定された範囲内にある [ない]。 | 2 項 | |
[NOT]IN | 互換性のある任意の型。全リストについてはデータ型を参照。 | 値が指定された値のセットにある [ない]。 | 2 項 | |
IS [NOT] NULL |
すべて | 値が NULL である [ない] |
単項 | |
IS [NOT] TRUE | BOOL | 値が TRUE である [ない]。 | 単項 | |
IS [NOT] FALSE | BOOL | 値が FALSE である [ない]。 | 単項 | |
10 | NOT | BOOL | 論理 NOT | 単項 |
11 | AND | BOOL | 論理 AND | 2 項 |
12 | OR | BOOL | 論理 OR | 2 項 |
優先順位が同じ演算子は左結合です。つまり、左から右に向かってグループ化されます。たとえば、次の式があるとします。
x AND y AND z
これは、次のように解釈されます。
( ( x AND y ) AND z )
次の式があるとします。
x * y / z
これは、次のように解釈されます。
( ( x * y ) / z )
すべての比較演算子の優先順位は同じですが、比較演算子は非結合です。したがって、あいまいさを解消するには、かっこが必要です。例:
(x < y) IS FALSE
要素アクセス演算子
演算子 | 構文 | 入力データ型 | 結果のデータ型 | 説明 |
---|---|---|---|---|
. | expression.fieldname1... | STRUCT |
fieldname1 に格納された型 T | ドット演算子。ネストされたフィールドにアクセスするために使用できます。例: expression.fieldname1.fieldname2... |
[ ] | array_expression [position_keyword (int_expression ) ] | ARRAY 関数を参照してください。 | ARRAY に保存された型 T | position_keyword は、OFFSET または ORDINAL のいずれかです。この演算子を使用する 2 つの関数については、ARRAY 関数をご覧ください。 |
算術演算子
以下の説明に示されていない限り、すべての算術演算子で数値型 T が受け入れられ、結果の型には型 T が含まれます。
名前 | 構文 |
---|---|
加算 | X + Y |
減算 | X - Y |
乗算 | X * Y |
除算 | X / Y |
単項プラス | + X |
単項マイナス | - X |
注: ゼロ除算はエラーを返します。異なる結果を取得するには、IEEE_DIVIDE または SAFE_DIVIDE 関数を使用してください。
加算、減算、乗算の結果の型:
入力 | INT64 | NUMERIC | FLOAT64 |
---|---|---|---|
INT64 | INT64 | NUMERIC | FLOAT64 |
NUMERIC | NUMERIC | NUMERIC | FLOAT64 |
FLOAT64 | FLOAT64 | FLOAT64 | FLOAT64 |
除算の結果の型:
入力 | INT64 | NUMERIC | FLOAT64 |
---|---|---|---|
INT64 | FLOAT64 | NUMERIC | FLOAT64 |
NUMERIC | NUMERIC | NUMERIC | FLOAT64 |
FLOAT64 | FLOAT64 | FLOAT64 | FLOAT64 |
単項プラスと単項マイナスの結果の型:
入力 | INT64 | NUMERIC | FLOAT64 |
---|---|---|---|
出力 | INT64 | NUMERIC | FLOAT64 |
ビット演算子
すべてのビット演算子は、第 1 オペランドと同じ型と同じ長さを返します。
名前 | 構文 | 入力データ型 | 説明 |
---|---|---|---|
ビット演算 NOT | ~ X | 整数または BYTES | 与えられた変数値の補数を形成し、各ビットの論理否定を実行します。 |
ビット演算 OR | X | Y | X : 整数または BYTES Y : X と同じ型 |
同じ長さの 2 つのビットパターンをとり、対応するビットの各ペアに論理包含的和演算を実行します。X と Y が BYTES で長さが異なる場合、この演算子はエラーを返します。 |
ビット演算 XOR | X ^ Y | X : 整数または BYTES Y : X と同じ型 |
同じ長さの 2 つのビットパターンをとり、対応するビットの各ペアに排他的論理和演算を実行します。 X と Y が BYTES で長さが異なる場合、この演算子はエラーを返します。 |
ビット演算 AND | X & Y | X : 整数または BYTES Y : X と同じ型 |
同じ長さの 2 つのビットパターンをとり、対応するビットの各ペアに論理 AND 演算を実行します。 X と Y が BYTES で長さが異なる場合、この演算子はエラーを返します。 |
左シフト | X << Y | X : 整数または BYTES Y : INT64 |
第 1 オペランド X を左方にシフトします。第 2 オペランド Y が第 1 オペランド X のビット長(たとえば X が INT64 型の場合は 64)以上である場合、この演算子は 0 または b'\x00' バイト シーケンスを返します。Y が負の数の場合はエラーを返します。 |
右シフト | X >> Y | X : 整数または BYTES Y : INT64 |
第 1 オペランド X を右方にシフトします。この演算子は、符号付きの型で符号ビット拡張を行いません(左側の空いたビットを 0 で埋めます)。第 2 オペランド Y が第 1 オペランド X のビット長(たとえば X が INT64 型の場合は 64)以上である場合、この演算子は 0 または b'\x00' バイト シーケンスを返します。Y が負の数の場合はエラーを返します。 |
論理演算子
Cloud Spanner SQL は、AND
、OR
、NOT
の論理演算子をサポートしています。論理演算子は BOOL 入力または NULL
入力のみを許可し、3 値論理を使用して結果を生成します。結果は TRUE
、FALSE
、NULL
のいずれかになります。
x | y | x AND y | x OR y |
---|---|---|---|
TRUE | TRUE | TRUE | TRUE |
TRUE | FALSE | FALSE | TRUE |
TRUE | NULL | NULL | TRUE |
FALSE | TRUE | FALSE | TRUE |
FALSE | FALSE | FALSE | FALSE |
FALSE | NULL | FALSE | NULL |
NULL | TRUE | NULL | TRUE |
NULL | FALSE | FALSE | NULL |
NULL | NULL | NULL | NULL |
x | NOT x |
---|---|
TRUE | FALSE |
FALSE | TRUE |
NULL | NULL |
例
このセクションの例では、entry_table
というテーブルを参照しています。
+-------+
| entry |
+-------+
| a |
| b |
| c |
| NULL |
+-------+
SELECT 'a' FROM entry_table WHERE entry = 'a'
-- a => 'a' = 'a' => TRUE
-- b => 'b' = 'a' => FALSE
-- NULL => NULL = 'a' => NULL
+-------+
| entry |
+-------+
| a |
+-------+
SELECT entry FROM entry_table WHERE NOT (entry = 'a')
-- a => NOT('a' = 'a') => NOT(TRUE) => FALSE
-- b => NOT('b' = 'a') => NOT(FALSE) => TRUE
-- NULL => NOT(NULL = 'a') => NOT(NULL) => NULL
+-------+
| entry |
+-------+
| b |
| c |
+-------+
SELECT entry FROM entry_table WHERE entry IS NULL
-- a => 'a' IS NULL => FALSE
-- b => 'b' IS NULL => FALSE
-- NULL => NULL IS NULL => TRUE
+-------+
| entry |
+-------+
| NULL |
+-------+
比較演算子
比較演算子は常に BOOL を返します。通常、両方のオペランドが同じ型である必要があります。オペランドの型が異なり、かつ Cloud Spanner SQL で精度が失われることなくこれらの型の値を共通の型に変換できる場合、一般的に Cloud Spanner SQL ではそれらをその共通の型に強制的に変換して、比較します。通常は、リテラルから非リテラルへの強制型変換を行います(この型変換が存在する場合)。比較可能なデータ型はデータ型に定義されています。
STRUCT は、4 つの比較演算子(等号 =、不等号 != と <>、IN)のみサポートします。
これらのデータ型を比較するときに、次の規則が適用されます。
- FLOAT64: NaN との比較演算は常に FALSE を返す。ただし、
!=
と<>
は TRUE を返します。 - BOOL: FALSE は TRUE よりも小さい。
- STRING: 文字列はコードポイントごとに比較される。つまり、正規的に同等の文字列は、それらが最初に正規化されている場合にのみ等しいと比較されることが保証されています。
NULL
: 変換がここで停止する。NULL
入力を持つ演算はすべてNULL
を返します。
名前 | 構文 | 説明 |
---|---|---|
より小さい | X < Y | X が Y よりも小さい場合に TRUE を返します。 |
以下 | X <= Y | X が Y 以下の場合、TRUE を返します。 |
より大きい | X > Y | X が Y よりも大きい場合、TRUE を返します。 |
以上 | X >= Y | X が Y 以上の場合、TRUE を返します。 |
等しい | X = Y | X が Y と等しい場合、TRUE を返します。 |
等しくない | X != Y X <> Y |
X が Y と等しくない場合、TRUE を返します。 |
BETWEEN | X [NOT] BETWEEN Y AND Z | X が指定された範囲内に [ない] 場合、TRUE を返します。「X BETWEEN Y AND Z」の結果は「Y <= X AND X <= Z」と等価ですが、前者では X は一度しか評価されません。 |
LIKE | X [NOT] LIKE Y | 第 1 オペランド X の文字列が第 2 オペランド Y によって指定されたパターンと一致するかどうかをチェックします。式には次の文字を含めることができます。
|
IN | 複数 - 以下を参照 | 右オペランドが空の場合、FALSE を返します。左のオペランドが NULL である場合、NULL を返します。右のオペランドに NULL が含まれている場合、TRUE または NULL を返します(FALSE を返すことはない)。IN のいずれかの側の引数は、一般式です。どちらのオペランドもリテラルにする必要はありませんが、右側にリテラルを使用するのが一般的です。X は一度だけ評価されます。 |
STRUCT データ型の値が等価かどうかテストする場合、1 つ以上のフィールドが NULL
になる場合があります。この場合、比較結果は次のようになります。
- NULL 以外のフィールドがすべて等しい場合、NULL を返します。
- NULL 以外のフィールドが等しくない場合、false を返します。
次の表は、STRUCT データ型が NULL
と評価されるフィールドを持つ場合にどのように比較されるかを示しています。
Struct1 | Struct2 | Struct1 = Struct2 |
---|---|---|
STRUCT(1, NULL) |
STRUCT(1, NULL) |
NULL |
STRUCT(1, NULL) |
STRUCT(2, NULL) |
FALSE |
STRUCT(1,2) |
STRUCT(1, NULL) |
NULL |
IN 演算子
IN
演算子は、次の構文をサポートします。
x [NOT] IN (y, z, ... ) # Requires at least one element
x [NOT] IN (<subquery>)
x [NOT] IN UNNEST(<array expression>) # analysis error if the expression
# does not return an ARRAY type.
IN
演算子いずれかの側の引数は、一般式です。右側の式にリテラルを使用するのが一般的ですが、必須ではありません。
次のセマンティックがあるとします。
x IN (y, z, ...)
これは、次と等価の定義になります。
(x = y) OR (x = z) OR ...
また、サブクエリと配列の形式は同様に定義されます。
x NOT IN ...
これは次と同等です。
NOT(x IN ...)
UNNEST 形式は、FROM 句に含まれる UNNEST
のような方法で配列スキャンを扱います。
x [NOT] IN UNNEST(<array expression>)
この形式は、ARRAY パラメータとともに使用されることがよくあります。例:
x IN UNNEST(@array_parameter)
注: NULL
ARRAY は空の ARRAY と同等に扱われます。
この構文の使用方法の詳細については、配列トピックをご覧ください。
IN
演算子を使用している場合、以下のセマンティクスが適用されます。
- 空の右辺式を持つ
IN
は常に FALSE です。 NULL
の左辺式を持ち、空ではない右辺式を持つIN
は常にNULL
ですIN
リスト内にNULL
を持つIN
は TRUE またはNULL
のみを返すことができます。FALSE は返されませんNULL IN (NULL)
はNULL
を返します。IN UNNEST(<NULL array>)
は FALSE を返します(NULL
ではない)。IN
リスト内にNULL
を持つNOT IN
は、FALSE またはNULL
のみを返すことができます。TRUE は返されません。
IN
は STRUCT のコンストラクタ構文を使用してマルチパート キーとともに使用できます。例:
(Key1, Key2) IN ( (12,34), (56,78) )
(Key1, Key2) IN ( SELECT (table.a, table.b) FROM table )
この構文の詳細については、データ型トピックの Struct 型セクションをご覧ください。
IS 演算子
IS 演算子は、テストしている条件に対して TRUE または FALSE を返します。数学関数で定義している IS_INF 関数や IS_NAN 関数とは異なり、入力が NULL
であっても、この演算子が NULL
を返すことはありません。NOT がある場合、出力 BOOL 値は反転されます。
関数の構文 | 入力データ型 | 結果のデータ型 | 説明 |
---|---|---|---|
X IS [NOT] NULL |
任意の値の型 | BOOL | オペランド X が NULL に評価された場合は TRUE を返し、それ以外の場合は FALSE を返します。 |
X IS [NOT] TRUE |
BOOL | BOOL | BOOL オペランドが TRUE に評価された場合は TRUE を返し、それ以外の場合は FALSE を返します。 |
X IS [NOT] FALSE |
BOOL | BOOL | BOOL オペランドが FALSE と評価された場合は TRUE を返します。それ以外の場合は FALSE を返します。 |
連結演算子
連結演算子は、複数の値を 1 つに結合します。
関数の構文 | 入力データ型 | 結果のデータ型 |
---|---|---|
STRING || STRING [ || ... ] |
STRING | STRING |
BYTES || BYTES [ || ... ] |
BYTES | STRING |
ARRAY<T> || ARRAY<T> [ || ... ] |
ARRAY<T> | ARRAY<T> |