Beam ZetaSQL 字句構造
Beam ZetaSQLは、標準SQLスカラーデータ型に加えて、配列、マップ、ネストされた行などの拡張機能をサポートしています。このページでは、Beam ZetaSQLでサポートされているZetaSQLデータ型について説明します。
データ型のプロパティ
次の表には、データ型のプロパティと、各プロパティが適用されるデータ型が含まれています。
プロパティ | 説明 | 適用対象 |
---|---|---|
Null許容 | NULL は有効な値です。 | 以下の例外を除くすべてのデータ型
|
順序付け可能 | ORDER BY 句で使用できます。 | 以下の例外を除くすべてのデータ型
|
グループ化可能 | 一般的に、GROUP BY 、DISTINCT 、またはPARTITION BY に続く式に含めることができます。ただし、 PARTITION BY 式には、浮動小数点型であるFLOAT とDOUBLE を含めることはできません。ただし、`PARTITION BY`式には、浮動小数点型`FLOAT`と`DOUBLE`を含めることはできません。 | 以下の例外を除くすべてのデータ型
|
比較可能 | 同じ型の値を互いに比較できます。 | 以下の例外を除くすべてのデータ型 ARRAYの比較はサポートされていません。
|
数値型
数値型には、整数型と浮動小数点型が含まれます。
整数型
整数は、小数部分のない数値です。
名前 | ストレージサイズ | 範囲 |
---|---|---|
INT64 | 8バイト | -9,223,372,036,854,775,808~9,223,372,036,854,775,807 |
浮動小数点型
浮動小数点値は、小数部分を持つ近似数値です。
名前 | ストレージサイズ | 説明 |
---|---|---|
FLOAT64 | 8バイト | 倍精度(近似)10進数値。 |
ブール型
名前 | 説明 |
---|---|
BOOL | ブール値は、キーワードTRUE とFALSE (大文字と小文字は区別されません)で表されます。 |
文字列型
名前 | 説明 |
---|---|
STRING | 可変長文字(Unicode)データ。 |
入力STRING値はUTF-8エンコードされている必要があり、出力STRING値はUTF-8エンコードされます。CESU-8やModified UTF-8などの代替エンコーディングは、有効なUTF-8として扱われません。
STRING値を操作するすべての関数と演算子は、バイトではなくUnicode文字で動作します。たとえば、SUBSTR
やLENGTH
などの関数をSTRING入力に適用すると、関数はバイトではなくUnicode文字をカウントします。比較はUnicode文字で定義されます。より小さい/大きい比較と`ORDER BY`は、文字ごとに比較し、低いUnicodeコードポイントは低い文字と見なされます。
バイト型
名前 | 説明 |
---|---|
BYTES | 可変長バイナリデータ。 |
STRINGとBYTESは別々の型であり、互換性はありません。STRINGとBYTES間のキャストは、バイトがUTF-8を使用してエンコードされていることを強制します。
タイムスタンプ型
注意:SQLはミリ秒の`TIMESTAMP`精度を持ちます。`TIMESTAMP`フィールドがミリ秒未満の精度を持っている場合、SQLは`IllegalArgumentException`をスローします。
名前 | 説明 | 範囲 |
---|---|---|
TIMESTAMP | ミリ秒精度で絶対的な時点を表します。 | 0001-01-01 00:00:00~9999-12-31 23:59:59.999 UTC。 |
タイムスタンプは、タイムゾーンや夏時間などの規則に関係なく、絶対的な時点を表します。
標準形式
YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.DDD]][time zone]
YYYY
:4桁の年[M]M
:1桁または2桁の月[D]D
:1桁または2桁の日( |T)
:スペースまたはT
セパレータ[H]H
:1桁または2桁の時間(有効な値は00~23)[M]M
:1桁または2桁の分(有効な値は00~59)[S]S
:1桁または2桁の秒(有効な値は00~59)[.DDD]
:最大3桁の小数点以下(つまり、ミリ秒精度まで)[タイムゾーン]
:タイムゾーンを表す文字列。詳細はタイムゾーンセクションを参照してください。
タイムゾーンは、タイムスタンプを解析したり、表示用にタイムスタンプを書式設定したりするときに使用されます。タイムスタンプ値自体には、特定のタイムゾーンは格納されません。文字列形式のタイムスタンプには、タイムゾーンが含まれる場合があります。タイムゾーンが明示的に指定されていない場合は、デフォルトのタイムゾーンであるUTCが使用されます。
タイムゾーン
タイムゾーンは、次の2つの標準形式のいずれかの文字列で表されます。
- 協定世界時(UTC)からのオフセット、またはUTCの場合は文字
Z
- tzデータベースからのタイムゾーン名
協定世界時(UTC)からのオフセット
オフセット形式
(+|-)H[H][:M[M]]
Z
例
-08:00
-8:15
+3:00
+07:30
-7
Z
この形式を使用する場合、タイムゾーンとタイムスタンプの残りの部分の間にスペースを入れることはできません。
2014-09-27 12:30:00.45-8:00
2014-09-27T12:30:00.45Z
タイムゾーン名
タイムゾーン名はtzデータベースからのものです。包括的ではないがより単純なリファレンスについては、Wikipediaのtzデータベースのタイムゾーンのリストを参照してください。
形式
continent/[region/]city
例
America/Los_Angeles
America/Argentina/Buenos_Aires
タイムゾーン名を使用する場合、名前とタイムスタンプの残りの部分の間にスペースが必要です。
2014-09-27 12:30:00.45 America/Los_Angeles
すべてのタイムゾーン名が、年の特定の期間に同じ時刻を報告する場合でも、互換性があるとは限らないことに注意してください。たとえば、`America/Los_Angeles`は、夏時間中は`UTC-7:00`と同じ時刻を報告しますが、夏時間外は`UTC-8:00`と同じ時刻を報告します。
タイムゾーンが指定されていない場合は、デフォルトのタイムゾーン値が使用されます。
うるう秒
タイムスタンプは、1分間に正確に60秒あると仮定して、1970-01-01 00:00:00 UTCからの単なるオフセットです。うるう秒は、格納されたタイムスタンプの一部としては表されません。
入力がうるう秒を表すために秒フィールドに「:60」を使用する値を含む場合、そのうるう秒はタイムスタンプ値に変換するときに保持されません。代わりに、その値は、次の分の秒フィールドに「:00」を持つタイムスタンプとして解釈されます。
うるう秒は、タイムスタンプの計算には影響しません。すべてのタイムスタンプ計算は、うるう秒を反映しないUnixスタイルのタイムスタンプを使用して行われます。うるう秒は、現実世界の時間を測定する関数を通じてのみ観察できます。これらの関数では、うるう秒がある場合にタイムスタンプの秒がスキップされたり繰り返されたりする可能性があります。
配列型
名前 | 説明 |
---|---|
ARRAY | 任意の非ARRAY型の0個以上の要素の順序付きリスト。 |
ARRAYは、0個以上の非ARRAY値の順序付きリストです。ARRAYのARRAYは許可されていません。ARRAYのARRAYを生成するクエリはエラーを返します。代わりに、`SELECT AS STRUCT`構文を使用して、ARRAYの間にSTRUCTを挿入する必要があります。
空のARRAYと`NULL` ARRAYは2つの異なる値です。ARRAYには`NULL`要素を含めることができます。
ARRAY型の宣言
ARRAY型は、山かっこ(`<`と`>`)を使用して宣言されます。ARRAYの要素の型は、ARRAYが別のARRAYを直接含むことができないことを除いて、任意に複雑にすることができます。
形式
ARRAY<T>
例
型宣言 | 意味 |
---|---|
ARRAY<INT64> | 64ビット整数の単純なARRAY。 |
ARRAY<STRUCT<INT64, INT64>> | それぞれが2つの64ビット整数を含むSTRUCTのARRAY。 |
ARRAY<ARRAY<INT64>> (サポートされていません) | これは、複数レベルのARRAYを作成する方法を探している場合に備えて、ここに含まれている**無効な**型宣言です。ARRAYはARRAYを直接含むことはできません。代わりに、次の例を参照してください。 |
ARRAY<STRUCT<ARRAY<INT64>>> | 64ビット整数のARRAYのARRAY。ARRAYは他のARRAYを直接保持できないため、2つのARRAYの間にSTRUCTがあることに注意してください。 |
構造体型
名前 | 説明 |
---|---|
STRUCT | それぞれに型(必須)とフィールド名(オプション)を持つ順序付きフィールドのコンテナ。 |
STRUCT型の宣言
STRUCT 型は、山括弧(<
および >
)を使用して宣言されます。STRUCT の要素の型は、任意の複雑さにすることができます。
形式
STRUCT<T>
例
型宣言 | 意味 |
---|---|
STRUCT<INT64> | 名前のない単一の 64 ビット整数フィールドを持つ単純な STRUCT です。 |
STRUCT<x STRUCT<y INT64, z INT64>> | ネストされた STRUCT x を内部に持つ STRUCT です。STRUCT x には、y と z の 2 つのフィールドがあり、どちらも 64 ビット整数です。 |
STRUCT<inner_array ARRAY<INT64>> | 64 ビット整数要素を保持する inner_array という名前の ARRAY を含む STRUCT です。 |
STRUCTの比較の制限
STRUCT は、等価演算子を使用して直接比較できます。
- 等しい(
=
) - 等しくない(
!=
または<>
) - [
NOT
]IN
ただし、これらの直接的な等価比較では、フィールド名を無視して、STRUCT のフィールドを序数順にペアワイズ比較することに注意してください。代わりに、STRUCT の同じ名前のフィールドを比較する場合は、個々のフィールドを直接比較できます。