標準 SQL の演算子

演算子は特殊文字やキーワードによって表されます。関数の呼び出し構文は使用しません。また、演算子は、オペランドとも呼ばれる任意の数のデータ入力を操作し、結果を返します。

一般的な慣例:

  • 特記のない限り、オペランドの 1 つが NULL の場合、すべての演算子は NULL を返します。
  • 演算結果がオーバーフローした場合、すべての演算子は、エラーをスローします。
  • 浮動小数点演算で、オペランドの 1 つが +/-inf または NaN の場合、+/-inf または NaN が返されます。それ以外の場合には、エラーが返されます。

次の表は、すべての BigQuery オペレータを最も優先順位の高い方から最も低い方に、つまり、それらがステートメント内で評価される順序で表示しています。

優先順位 演算子 入力データ型 名前 演算子の項数
1 . STRUCT
メンバーのフィールド アクセス演算子 2 項
  [ ] ARRAY 配列位置。OFFSET または ORDINAL とともに使用する必要があります。ARRAY 関数を参照。 2 項
2 - すべての数値型 単項マイナス 単項
  ~ 整数または BYTES ビット演算 NOT 単項
3 * すべての数値型 乗算 2 項
  / すべての数値型 除算 2 項
  || STRING、BYTES、または ARRAY<T> 連結演算子 2 項
4 + すべての数値型
DATE と INT64
加算 2 項
  - すべての数値型
DATE と INT64
減算 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

注: ゼロ除算はエラーを返します。異なる結果を取得するには、IEEE_DIVIDE または SAFE_DIVIDE 関数を使用してください。

加算、減算、乗算の結果の型:

入力INT64NUMERICFLOAT64
INT64INT64NUMERICFLOAT64
NUMERICNUMERICNUMERICFLOAT64
FLOAT64FLOAT64FLOAT64FLOAT64

除算の結果の型:

入力INT64NUMERICFLOAT64
INT64FLOAT64NUMERICFLOAT64
NUMERICNUMERICNUMERICFLOAT64
FLOAT64FLOAT64FLOAT64FLOAT64

単項マイナスの場合の結果のデータ型:

入力INT64NUMERICFLOAT64
出力INT64NUMERICFLOAT64

日付算術演算子

演算子「+」と「-」は、日付の算術演算に使用できます。

date_expression + int64_expression
int64_expression + date_expression
date_expression - int64_expression

説明

date_expression に対して int64_expression 日を加算または減算します。間隔が日数で表現されている場合、DATE_ADD 関数または DATE_SUB 関数と同等です。

戻りデータの型

DATE

SELECT DATE "2020-09-22" + 1 AS day_later, DATE "2020-09-22" - 7 AS week_ago

+------------+------------+
| day_later  | week_ago   |
+------------+------------+
| 2020-09-23 | 2020-09-15 |
+------------+------------+

ビット演算子

すべてのビット演算子は、第 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 が負の数の場合はエラーを返します。

論理演算子

BigQuery は、ANDORNOT の論理演算子をサポートしています。論理演算子は BOOL 入力または NULL 入力のみを許可し、3 値論理を使用して結果を生成します。結果は TRUEFALSENULL のいずれかになります。

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 を返します。通常、両方のオペランドが同じ型である必要があります。オペランドの型が異なる場合、BigQuery で精度を失うことなくこれらの型の値を共通の型に変換できるなら、一般的に BigQuery ではそれらをその共通の型に強制的に変換して、比較します。通常は、リテラルから非リテラルへの強制型変換を行います(この型変換が存在する場合)。比較可能なデータ型はデータ型に定義されています。

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 によって指定されたパターンと一致するかどうかをチェックします。式には次の文字を含めることができます。
  • パーセント記号「%」は、任意の数の文字またはバイトと一致します。
  • アンダースコア「_」は、単一の文字またはバイトと一致します。
  • 「\」、「_」 または「%」は、2 つのバックスラッシュを使用してエスケープできます。たとえば "\\%" です。文字列をそのまま使用する場合には、バックスラッシュを 1 つだけ使用します。例: r"\%"
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>