BigQuery 向けの GoogleSQL は変換をサポートしています。 変換には、キャスティング、強制型変換、スーパータイプの設定が含まれますが、これらに限定されません。
- キャスティングは明示的変換であり、
CAST()
関数を使用します。 - 強制型変換は暗黙的変換であり、以下で説明されている状態の場合に GoogleSQL によって自動的に実行されます。
- スーパータイプは共通の型であり、この型に 2 つ以上の式を強制変換できます。
PARSE_DATE()
など、独自の関数名を持つ変換もあります。これらの関数の詳細については、変換関数をご覧ください。
キャストと強制型変換の比較
以下の表に、考えられるすべてのキャストと、GoogleSQL データ型に対する強制型変換の可能性の要約を示します。「強制型変換後」は所定のデータ型(列など)のすべての式に適用されますが、リテラルとパラメータも強制型変換されます。詳細については、リテラル強制型変換とパラメータ強制型変換をご覧ください。
元の型 | キャスト先 | 強制型変換後 |
---|---|---|
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
を使用する場合、GoogleSQL がそのキャスティングを実行できなければクエリは失敗します。このようなエラーを防ぐには、SAFE_CAST
を使用します。CAST
、SAFE_CAST
などのキャスト関数のルールの詳細については、変換関数をご覧ください。
強制型変換
GoogleSQL は、関数のシグネチャを一致させる必要がある場合、引数式の結果の型を別の型に強制的に変換します。たとえば、関数 func()
が FLOAT64
型の単一の引数を取るように定義され、式が結果の型が INT64
である引数として使用される場合は、func()
が計算される前に、式の結果が FLOAT64
型に強制変換されます。
リテラル強制型変換
GoogleSQL は、次のリテラル強制型変換をサポートしています。
入力データ型 | 結果のデータ型 | 注 |
---|---|---|
STRING リテラル | DATE DATETIME TIME TIMESTAMP |
リテラル強制型変換は、実際のリテラル型が、対象の関数によって要求される型と異なる場合に必要です。たとえば、関数 func()
が DATE 引数を取る場合、文字列リテラル "2014-09-27"
は DATE
に強制変換されるため、式 func("2014-09-27")
は有効です。
リテラル変換は解析時に評価され、入力リテラルを目的の型に正常に変換できない場合、エラーが発生します。
パラメータ強制型変換
GoogleSQL は、次のパラメータ強制型変換をサポートしています。
入力データ型 | 結果のデータ型 |
---|---|
STRING パラメータ | DATE DATETIME TIME TIMESTAMP |
パラメータ値を目的の型に正常に強制変換できない場合は、エラーが発生します。
スーパータイプ
スーパータイプは共通の型であり、この型に 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 に適用すると、スーパータイプに設定されている厳密な数値タイプと厳密ではない数値タイプが存在するため、スーパータイプの設定は成功します。 |
タイプの特異性
各タイプには、サポートする値のドメインがあります。範囲が狭いドメインは、範囲が広いドメインよりも特異性の高いタイプです。厳密ではないタイプは、厳密なタイプよりもサポートされるドメイン値の範囲が広いため、厳密なタイプは厳密ではないタイプよりも特異性が高くなります。たとえば、INT64
は FLOAT64
よりも特異性が高いタイプです。
スーパータイプとリテラル
リテラルのスーパールールは、通常の式よりも制約が緩く、暗黙の強制型変換ルールと同じになります。リテラル関連の型が入力セットに含まれている場合は、次のアルゴリズムが使用されます。
- セットにリテラル以外の型が存在する場合は、リテラル以外で共通するスーパータイプのセットを探します。
- 少なくとも 1 つのスーパータイプが存在する場合は、残りのリテラル型を暗黙的に強制型変換できる最も特異性の高い型を見つけて、そのスーパータイプを返します。それ以外の場合、スーパータイプは存在しません。
- セットにリテラルに関連する型のみが含まれている場合は、リテラル型のスーパータイプを計算します。
- すべての入力タイプが
NULL
リテラルに関連する場合、生成されるスーパータイプはINT64
です。 - 共通のスーパータイプが見つからない場合は、エラーが発生します。
例
入力値の型 | 共通のスーパータイプ | 戻り値 |
---|---|---|
INT64 リテラル UINT64 式 |
UINT64 | UINT64 |
TIMESTAMP 式 STRING リテラル |
TIMESTAMP | TIMESTAMP |
NULL リテラル NULL リテラル |
INT64 | INT64 |
BOOL リテラル TIMESTAMP リテラル |
なし | エラー |