標準 SQL の変換規則

変換には、キャスティング、強制型変換、スーパータイプの設定が含まれますが、これらに限定されません。

  • キャスティングは明示的変換であり、CAST() 関数を使用します。
  • 強制型変換は暗黙的変換であり、以下で説明されている状態の場合に BigQuery によって自動的に実行されます。
  • スーパータイプは共通の型であり、この型に 2 つ以上の式を強制変換できます。

PARSE_DATE() など、独自の関数名を持つ変換もあります。これらの関数の詳細については、変換関数をご覧ください。

キャストと強制型変換の比較

以下の表に、考えられるすべてのキャストと、BigQuery データ型に対する強制型変換の可能性の要約を示します。「強制型変換後」は所定のデータ型(列など)のすべての式に適用されますが、リテラルとパラメータも強制型変換されます。詳細については、リテラル強制型変換パラメータ強制型変換をご覧ください。

元の型 キャスト先 強制型変換後
INT64 BOOL
INT64
NUMERIC
BIGNUMERIC
FLOAT64
STRING
NUMERIC
BIGNUMERIC
FLOAT64
NUMERIC INT64
NUMERIC
BIGNUMERIC
FLOAT64
STRING
BIGNUMERIC
FLOAT64
BIGNUMERIC INT64
NUMERIC
BIGNUMERIC
FLOAT64
STRING
FLOAT64
FLOAT64 INT64
NUMERIC
BIGNUMERIC
FLOAT64
STRING
 
BOOL BOOL
INT64
STRING
 
STRING BOOL
INT64
NUMERIC
BIGNUMERIC
FLOAT64
STRING
BYTES
DATE
DATETIME
TIME
TIMESTAMP
 
BYTES STRING
BYTES
 
DATE STRING
DATE
DATETIME
TIMESTAMP
DATETIME
DATETIME STRING
DATE
DATETIME
TIME
TIMESTAMP
 
TIME STRING
TIME
 
TIMESTAMP STRING
DATE
DATETIME
TIME
TIMESTAMP
 
ARRAY ARRAY  
STRUCT STRUCT  

キャスティング

ほとんどのデータ型は、CAST 関数を使用して別の型にキャスティングできます。CAST を使用する場合、BigQuery がそのキャスティングを実行できなければクエリは失敗します。このようなエラーを防ぐには、SAFE_CAST を使用します。CASTSAFE_CAST などのキャスト関数のルールの詳細については、変換関数をご覧ください。

強制型変換

BigQuery は、関数のシグネチャを一致させる必要がある場合、引数式の結果の型を別の型に強制的に変換します。たとえば、関数 func()FLOAT64 型の単一の引数を取るように定義され、式が結果の型が INT64 である引数として使用される場合は、func() が計算される前に、式の結果が FLOAT64 型に強制変換されます。

リテラル強制型変換

BigQuery では、次のリテラル強制型変換がサポートされています。

入力データ型 結果のデータ型
STRING リテラル DATE
DATETIME
TIME
TIMESTAMP

リテラル強制型変換は、実際のリテラル型が、対象の関数によって要求される型と異なる場合に必要です。たとえば、関数 func() が DATE 引数を取る場合、文字列リテラル "2014-09-27"DATE に強制変換されるため、式 func("2014-09-27") は有効です。

リテラル変換は解析時に評価され、入力リテラルを目的の型に正常に変換できない場合、エラーが発生します。

パラメータ強制型変換

BigQuery では、次のパラメータ強制型変換がサポートされています。

入力データ型 結果のデータ型
STRING パラメータ

パラメータ値を目的の型に正常に強制変換できない場合は、エラーが発生します。

スーパータイプ

スーパータイプは共通の型であり、この型に 2 つ以上の式を強制変換できます。スーパータイプは、UNION ALL などの集合演算や、一致する型の複数の引数を想定する CASE などの式で使用されます。各タイプには、タイプ自体を含む 1 つ以上のスーパータイプがあり、これによりスーパータイプのセットが定義されます。

入力タイプ スーパータイプ
BOOL BOOL
INT64 INT64
FLOAT64
NUMERIC
BIGNUMERIC
FLOAT64 FLOAT64
NUMERIC NUMERIC
BIGNUMERIC
FLOAT64
DECIMAL DECIMAL
BIGDECIMAL
FLOAT64
BIGNUMERIC BIGNUMERIC
FLOAT64
BIGDECIMAL BIGDECIMAL
FLOAT64
STRING STRING
DATE DATE
TIME TIME
DATETIME DATETIME
TIMESTAMP TIMESTAMP
BYTES BYTES
STRUCT フィールド位置の型が同一の STRUCT。
ARRAY 要素の型が同一の ARRAY。
GEOGRAPHY GEOGRAPHY

入力タイプのセットのスーパータイプを見つける場合は、まず、入力タイプごとにスーパータイプのセットの共通部分を特定します。このセットが空の場合、入力タイプに共通のスーパータイプはありません。このセットが空でない場合、共通のスーパータイプは通常、そのセット内で最も特異性の高いタイプです。一般的に、最も特異性の高いタイプは、最も制限の厳しいドメインを持つタイプです。

入力タイプ 共通のスーパータイプ 戻り値
INT64
FLOAT64
FLOAT64 FLOAT64 INT64 と FLOAT64 にスーパータイプの設定を適用すると、これらはスーパータイプである FLOAT64 を共有するため、スーパータイプの設定が成功します。
INT64
BOOL
なし エラー INT64 と BOOL にスーパータイプの設定を適用すると、これらは共通のスーパータイプを共有していないため、スーパータイプの設定が失敗します。

厳密なタイプと厳密ではないタイプ

数値タイプは、厳密なタイプの場合と厳密ではないタイプの場合とがあります。スーパータイプに設定する際に、すべての入力タイプが厳密なタイプである場合は、生成されるスーパータイプを厳密なタイプに限定できます。

次の表に、厳密な数値データタイプと厳密ではない数値データタイプの一覧を示します。

厳密なタイプ 厳密ではないタイプ
INT64
NUMERIC
BIGNUMERIC
FLOAT64

入力タイプ 共通のスーパータイプ 戻り値
INT64
FLOAT64
FLOAT64 FLOAT64 スーパータイプの設定を INT64 と DOUBLE に適用すると、スーパータイプに設定されている厳密な数値タイプと厳密ではない数値タイプが存在するため、スーパータイプの設定は成功します。

タイプの特異性

各タイプには、サポートする値のドメインがあります。範囲が狭いドメインは、範囲が広いドメインよりも特異性の高いタイプです。厳密ではないタイプは、厳密なタイプよりもサポートされるドメイン値の範囲が広いため、厳密なタイプは厳密ではないタイプよりも特異性が高くなります。たとえば、INT64FLOAT64 よりも特異性が高いタイプです。

スーパータイプとリテラル

リテラルのスーパールールは、通常の式よりも制約が緩く、暗黙の強制型変換ルールと同じになります。リテラル関連の型が入力セットに含まれている場合は、次のアルゴリズムが使用されます。

  • セットにリテラル以外の型が存在する場合は、リテラル以外で共通するスーパータイプのセットを探します。
  • 少なくとも 1 つのスーパータイプが存在する場合は、残りのリテラル型を暗黙的に強制型変換できる最も特異性の高い型を見つけて、そのスーパータイプを返します。それ以外の場合、スーパータイプは存在しません。
  • セットにリテラルに関連する型のみが含まれている場合は、リテラル型のスーパータイプを計算します。
  • すべての入力タイプが NULL リテラルに関連する場合、生成されるスーパータイプは INT64 です。
  • 共通のスーパータイプが見つからない場合は、エラーが発生します。

入力タイプ 共通のスーパータイプ 戻り値
INT64 リテラル
UINT64 式
UINT64 UINT64
TIMESTAMP 式
STRING リテラル
TIMESTAMP TIMESTAMP
NULL リテラル
NULL リテラル
INT64 INT64
BOOL リテラル
TIMESTAMP リテラル
なし エラー