語彙の構造と構文

Cloud Spanner SQL のステートメントは一連のトークンから構成されます。トークンには識別子、引用符付き識別子、リテラル、キーワード、演算子、そして特殊文字があります。トークンは空白文字(スペース、バックスペース、タブ、改行)またはコメントで区切ることができます。

識別子

識別子は、列、テーブルなどのデータベース オブジェクトに関連付けられる名前です。

識別子は文字またはアンダースコアで始める必要があります。後続の文字には、文字、数字、アンダースコアを使用できます。引用符付き識別子とは、バッククォート(`)文字で囲まれた識別子のことで、スペースや記号などあらゆる文字を含めることができます。ただし、引用符付き識別子は空にすることはできません。予約済みキーワードは、バッククォートで囲まれている場合のみ識別子として使用できます。

構文(ここでは正規表現として定義します):

[A-Za-z_][A-Za-z_0-9]*

例:

Customers5
_dataField1
ADGROUP

無効な例:

5Customers
_dataField!
GROUP

5Customers は文字やアンダースコアではなく数字から始まっています。_dataField!には特殊文字 "!" が含まれており、これは文字でも数字でもアンダースコアでもありません。 GROUP は予約済みキーワードであるため、バッククォート文字で囲まないと識別子としては使用できません。

識別子も引用符付き識別子も大文字と小文字は区別されませんが、若干の意味的な違いがあります。詳細については、大文字と小文字の区別をご覧ください。

引用符付きの識別子のエスケープ シーケンスは、この後で説明する文字列リテラルと同じです。

リテラル

リテラルは組み込みのデータ型の定数値を表します。一部のデータ型(すべてではありません)はリテラルとして表すことができます。

文字列リテラルとバイトリテラル

文字列リテラルとバイトリテラルはどちらも引用符で囲む必要があります。単一引用符(')または二重引用符(")を使用するか、3 つの単一引用符(''')または 3 つの二重引用符(""")からなる三重引用符を使用します。

引用符付きリテラル:

リテラル 説明
引用符付き文字列
  • "abc"
  • "it's"
  • 'it\'s'
  • 'Title: "Boy"'
単一引用符(')で囲んだ引用符付き文字列には、エスケープしていない二重引用符(")を含めることができ、その逆も可能です。
バックスラッシュ(\)はエスケープ シーケンスを導入します。下の「エスケープ シーケンス」の表をご覧ください。
引用符付き文字列には改行を含めることはできず、先頭にバックスラッシュ(\)を付けても機能しません。

三重引用符付き文字列
  • """abc"""
  • '''it's'''
  • '''Title:"Boy"'''
  • '''two
    lines'''
  • '''why\?'''
組み込みの改行と引用符はエスケープしなくても使用できます。4 番目の例をご覧ください。
バックスラッシュ(\)はエスケープ シーケンスを導入します。下の「エスケープ シーケンス」の表をご覧ください。
行の末尾にエスケープしないバックスラッシュ(\)を付けることはできません。
開始引用符と一致する 3 つの連続したエスケープしない引用符を入力すると、文字列が終了します。


生の文字列
  • R"abc+"
  • r'''abc+'''
  • R"""abc+"""
  • r'f\(abc,(.*),def\)'
生の文字列のリテラル プレフィックス(r または R)を持つ、引用符または三重引用符付きのリテラルは、生のあるいは正規表現の文字列と解釈されます。
バックスラッシュ文字(\)はエスケープ文字としては機能しません。文字列リテラルの内部にバックスラッシュとそれに続く別の文字がある場合は、両方の文字が保持されます。
生の文字列は、奇数のバックスラッシュで終えることはできません。
生の文字列は正規表現を作成するのに便利です。


プレフィックス文字(rRbB))は、引用符または三重引用符付きの文字列ではオプションであり、それぞれ文字列が生のあるいは正規表現の文字列であるか、またはバイト シーケンスであることを示します。たとえば、b'abc'b'''abc''' はいずれも bytes 型として解釈されます。プレフィックス文字は大文字と小文字が区別されません。

プレフィックスを含む引用符付きリテラル:

リテラル 説明
バイト
  • B"abc"
  • B'''abc'''
  • b"""abc"""
引用符または三重引用符付きのリテラルで、バイトリテラル プレフィックス(b または B)を持つものはバイトと見なされます。
生バイト
  • br'abc+'
  • RB"abc+"
  • RB'''abc'''
rb のプレフィックスは任意の順序で組み合わせることができます。たとえば、rb'abc*'br'abc*' は同等です。

次の表は、文字列リテラルとバイトリテラルで英数字以外の文字を表すために有効なすべてのエスケープ シーケンスの一覧です。この表に示されていないシーケンスはすべてエラーとなります。

エスケープ シーケンス 説明
\a ベル
\b バックスペース
\f 改ページ
\n 改行
\r 復帰
\t タブ
\v 垂直タブ
\\ バックスラッシュ(\
\? 疑問符(?
\" 二重引用符("
\' 単一引用符('
\` バッククォート(`
\ooo 3 桁の数字(0~7)による 8 進エスケープ。単一の Unicode 文字(文字列リテラルの場合)またはバイト(バイトリテラルの場合)にデコードされます。
\xhh または \Xhh 2 桁の 16 進数(0~9 または A~F / a~f)による 16 進エスケープ。単一の Unicode 文字(文字列リテラルの場合)またはバイト(バイトリテラルの場合)にデコードされます。例:
  • '\x41' == 'A'
  • '\x41B''AB'
  • '\x4' はエラー
\uhhhh 小文字の「u」と 4 桁の 16 進数を含む Unicode エスケープ。文字列リテラルまたは識別子でのみ有効です。
D800~DFFF の範囲は、サロゲート Unicode 値であるため許可されないことに注意してください。
\Uhhhhhhhh 大文字の「U」と 8 桁の 16 進数を含む Unicode エスケープ。文字列リテラルまたは識別子でのみ有効です。
D800~DFFF の範囲は、サロゲート Unicode 値であるため許可されないことに注意してください。また、10FFFF を超える値も使用できません。

整数リテラル

整数リテラルは 10 進数(0~9)のシーケンスか、または "0x" のプレフィックスが付いた 16 進数値になります。整数値は先頭に "+" または "-" を付けて、それぞれ正の値または負の値を示すことができます。

例:

123
0xABC
-123

整数リテラルは INT64 として解釈されます。

浮動小数点リテラル

構文オプション:

[+-]DIGITS.[DIGITS][e[+-]DIGITS]
[DIGITS].DIGITS[e[+-]DIGITS]
DIGITSe[+-]DIGITS

DIGITS は 1 つまたは複数の 10 進数(0~9)を表し、e は指数マーカー(e または E)を表します。

例:

123.456e-67
.1E4
58.
4e2

小数点または指数マーカーを含む数値リテラルは、double 型であるものと推定されます。

浮動小数点リテラルを float 型に暗黙的に強制変換することは、値が有効な浮動小数点数の範囲内であれば可能です。

NaN または無限を表すリテラル表現はありませんが、以下の大文字と小文字を区別しない文字列は明示的に浮動小数点数にキャストできます。

  • "NaN"
  • "inf" または "+inf"
  • "-inf"

配列リテラル

配列リテラルは角括弧で囲まれた要素のカンマ区切りリストです。ARRAY キーワードはオプションであり、明示的な要素型 T もオプションです。

例:

[1, 2, 3]
['x', 'y', 'xy']
ARRAY[1, 2, 3]
ARRAY<string>['x', 'y', 'xy']
ARRAY<int64>[]

構造体リテラル

構文:

(elem[, elem...])

elem は構造体の要素です。elem は式や列名ではなく、リテラルのデータ型でなければなりません。

出力データ型は匿名 struct 型になり(struct は名前付きの型ではありません)、入力式のデータ型と一致する型の匿名のフィールドが含まれます。

出力データ型
(1, 2, 3) STRUCT<int64,int64,int64>
(1, 'abc') STRUCT<int64,string>

日付リテラル

構文:

DATE 'YYYY-M[M]-D[D]'

日付リテラルでは、DATE キーワードの後に、正規の日付形式に従う単一引用符で囲まれた文字列リテラルが続きます。日付リテラルでは 1~9999 の範囲の年数がサポートされます。この範囲外となる日付は無効です。

たとえば、次の日付リテラルは 2014 年 9 月 27 日を表しています。

DATE '2014-09-27'

正規の日付形式による文字列リテラルも、DATE 型の式が予想される場所で使用すると、暗黙的に DATE 型に強制変換されます。たとえば次のようなクエリがあるとします。

SELECT * FROM foo WHERE date_col = "2014-09-27"

この文字列リテラル "2014-09-27" は、日付リテラルに強制変換されます。

タイムスタンプ リテラル

構文:

TIMESTAMP 'YYYY-[M]M-[D]D [[H]H:[M]M:[S]S[.DDDDDD]] [timezone]'

タイムスタンプ リテラルには、TIMESTAMP キーワードと、正規のタイムスタンプ形式に従う単一引用符で囲まれた文字列リテラルが含まれます。

タイムスタンプ リテラルでは 1~9999 の範囲の年数がサポートされます。この範囲外となるタイムスタンプは無効です。

タイムスタンプのリテラルには、タイムゾーンを示すために数値サフィックスを含めることができます。

TIMESTAMP '2014-09-27 12:30:00.45-08'

このサフィックスがない場合、デフォルトのタイムゾーンである America/Los_Angeles が使用されます。

たとえば、次のタイムスタンプは 2017 年 9 月 27 日午後 12 時 30 分を表し、タイムゾーンには America/Los_Angeles が使用されています。

TIMESTAMP '2014-09-27 12:30:00.45'

タイムゾーンの詳細については、タイムゾーンをご覧ください。

正規のタイムスタンプ形式に従う文字列リテラル(タイムゾーン名が含まれるものも含む)は、タイムスタンプ式が予想される場所で使用すると、暗黙的にタイムスタンプ リテラルに強制変換されます。たとえば次のクエリでは、文字列リテラル "2014-09-27 12:30:00.45 America/Los_Angeles" がタイムスタンプ リテラルに強制変換されます。

SELECT * FROM foo
WHERE timestamp_col = "2014-09-27 12:30:00.45 America/Los_Angeles"

タイムゾーン

タイムスタンプ リテラルは特定の時点にマッピングされる必要があるため、リテラルを正しく解釈するためにはタイムゾーンが必要となります。リテラル自体の一部としてタイムゾーンを指定しなかった場合は、Cloud Spanner SQL の実装によって設定されたデフォルトのタイムゾーン値が使用されます。

タイムゾーンは次の正規形式に従う文字列で表されます。この形式は協定世界時(UTC)からのオフセットを表しています。

形式:

(+|-)H[H][:M[M]]

例:

'-08:00'
'-8:15'
'+3:00'
'+07:30'
'-7'

タイムゾーンは tz database からの文字列タイムゾーン名を使用して表すこともできます。あまり包括的ではありませんが簡潔な資料としては、Wikipedia の tz database のタイムゾーン一覧をご覧ください。正規のタイムゾーン名の形式は <continent/[region/]city> となり、たとえば America/Los_Angeles などとなります。

タイムゾーン名によって 1 年の特定の期間に同じ時刻が偶然レポートされたとしても、すべてのタイムゾーン名が交換可能なわけではありません。たとえば、夏時間中に America/Los_AngelesUTC-7:00 と同じ時刻をレポートしたとしても、夏時間以外では同じ時刻は UTC-8:00 としてレポートされます。

例:

TIMESTAMP '2014-09-27 12:30:00 America/Los_Angeles'
TIMESTAMP '2014-09-27 12:30:00 America/Argentina/Buenos_Aires'

大文字と小文字の区別

Cloud Spanner SQL では、大文字と小文字の区別については以下の規則に従います。

カテゴリ 大文字と小文字の区別 メモ
キーワード ×  
関数名 ×  
テーブル名 メモを参照 通常、テーブル名では大文字と小文字が区別されませんが、大文字と小文字を区別するテーブル名を含むデータベースにクエリを実行する場合には、大文字と小文字が区別されます。
列名 ×  
文字列の値
文字列の比較  
クエリ内のエイリアス ×  
正規表現照合 メモを参照 正規表現照合ではデフォルトで大文字と小文字が区別されますが、正規表現自体が大文字と小文字を区別しないよう指定している場合は除きます。
LIKE 照合  

予約済みキーワード

キーワードは Cloud Spanner SQL 言語で特殊な意味を持つトークンのグループであり、次のような特性があります。

  • キーワードはバッククォート(`)文字で囲まない限り、識別子として使用することはできません。
  • キーワードでは大文字と小文字が区別されません。

Cloud Spanner SQL には以下のような予約済みキーワードがあります。

ALL
AND
ANY
ARRAY
AS
ASC
ASSERT_ROWS_MODIFIED
AT
BETWEEN
BY
CASE
CAST
COLLATE
CONTAINS
CREATE
CROSS
CUBE
CURRENT
DEFAULT
DEFINE
DESC
DISTINCT
ELSE
END
ENUM
ESCAPE
EXCEPT
EXCLUDE
EXISTS
EXTRACT
FALSE
FETCH
FOLLOWING
FOR
FROM
FULL
GROUP
GROUPING
GROUPS
HASH
HAVING
IF
IGNORE
IN
INNER
INTERSECT
INTERVAL
INTO
IS
JOIN
LATERAL
LEFT
LIKE
LIMIT
LOOKUP
MERGE
NATURAL
NEW
NO
NOT
NULL
NULLS
OF
ON
OR
ORDER
OUTER
OVER
PARTITION
PRECEDING
PROTO
RANGE
RECURSIVE
RESPECT
RIGHT
ROLLUP
ROWS
SELECT
SET
SOME
STRUCT
TABLESAMPLE
THEN
TO
TREAT
TRUE
UNBOUNDED
UNION
UNNEST
USING
WHEN
WHERE
WINDOW
WITH
WITHIN

終了セミコロン

ステートメントでは、アプリケーション プログラミング インターフェース(API)を通して送信するクエリ文字列の場合、オプションで終了セミコロン(;)を使用できます。一部の対話型ツールでは、ステートメントに終了セミコロンを使用する必要があります。複数のステートメントを含むリクエストでは、各ステートメントをセミコロンで区切る必要がありますが、最終ステートメントではセミコロンはオプションになります。

クエリ パラメータ

構文:

@param

クエリ パラメータは、識別子の先頭に @ 文字が付いています。ユーザーは、クエリ ステートメントの外部でパラメータを定義します。

クエリ パラメータは、任意の式の代わりに使用できます。ただし、識別子、列名、テーブル名などのクエリの他の部分と置き換えることはできません。

クライアント API を使用すると、パラメータ名と値をバインドできます。実行時にパラメータはバインドされた値に置換されます。クライアント API によっては、クエリで特定の値にバインドされていないパラメータを使用できますが、パラメータの型はクエリの分析時に定義する必要があります。

例:

SELECT * FROM Roster WHERE LastName = @myparam

LastName がクエリ パラメータ myparam の値と一致する行をすべて返します。

コメント

コメントはパーサーによって無視される文字シーケンスです。Cloud Spanner SQL では、次の種類のコメントを使用できます。

単一行のコメント

単一行コメントは、コメントの前に # または -- を入力することでサポートされます。

SELECT x FROM T; # x is a field and T is a table

コメントには「#」文字から行末までのすべての文字が含まれます。

SELECT x FROM T; --x is a field and T is a table

コメントには「--」シーケンスから行末までのすべての文字が含まれます。オプションで、「--」の後にスペースを追加することもできます。

複数行のコメント

複数行コメントは、/* <comment> */ の形式でコメントを囲むことでサポートされます。

例:

SELECT x FROM T /* x is a field and T is a table */
WHERE x = 3;

無効な例:

SELECT x FROM T /* comment starts here
                /* comment ends on this line */
                this line is not considered a comment */
WHERE x = 3;

コメントには、最初の「/*」とその後の最初の「*/」で囲まれた、改行を含むすべての文字が含まれます。ネストされたコメントはサポートされていません。2 番目の例にはネストされたコメントが含まれているため、このクエリは無効になります。

このページは役立ちましたか?評価をお願いいたします。

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

Cloud Spanner のドキュメント