標準 SQL の演算子

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

一般的な慣例:

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

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

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

下の例よりも、上の例のようにすることをおすすめします。

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
INT64INT64NUMERICFLOAT64
NUMERICNUMERICNUMERICFLOAT64
FLOAT64FLOAT64FLOAT64FLOAT64

除算の結果の型:

 INT64NUMERICFLOAT64
INT64FLOAT64NUMERICFLOAT64
NUMERICNUMERICNUMERICFLOAT64
FLOAT64FLOAT64FLOAT64FLOAT64

単項マイナスの結果の型:

入力データ型 結果のデータ型
INT64 INT64
NUMERIC NUMERIC
FLOAT64 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 のビット長(たとえば、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 が負の数の場合、この演算子はエラーを返します。

論理演算子

すべての論理演算子は BOOL 入力のみ許可します。

名前 構文 説明
論理 NOT NOT X 入力が TRUE の場合は FALSE を返します。入力が FALSE の場合は TRUE を返します。それ以外では NULL を返します。
論理 AND X AND Y 少なくとも 1 つの入力が FALSE の場合、FALSE を返します。X と Y の両方が TRUE の場合、TRUE を返します。それ以外では NULL を返します。
論理 OR X OR Y X と Y の両方が FALSE であれば FALSE を返します。少なくとも 1 つの入力が TRUE の場合、TRUE を返します。それ以外では 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 を返します。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 の左辺式を持ち、空ではない右辺式を持つ NULL は常に IN です
  • IN リスト内に NULL を持つ IN は TRUE または NULL のみを返すことができます。FALSE は返されません
  • NULL IN (NULL)NULL を返します
  • IN UNNEST(<NULL array>) は FALSE(NULL ではない)を返します

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 を返します。
このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。