語彙の構造と構文

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''' は両方ともタイプバイトと解釈されます。プレフィックス文字では大文字と小文字が区別されません。

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

リテラル 説明
バイト
  • 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 エスケープ。文字列リテラルまたは識別子でのみ有効です。
サロゲート Unicode 値になるため、範囲 D800~DFFF の使用は許可されていません。
\Uhhhhhhhh 大文字の「U」と 8 桁の 16 進数を含む Unicode エスケープ。文字列リテラルまたは識別子でのみ有効です。
サロゲート Unicode 値になるため、範囲 D800~DFFF の使用は許可されていません。また、10FFFF を超える値も使用できません。

整数リテラル

整数リテラルは、10 進数(0~9)のシーケンスか、「0x」または「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 が使用されます。

たとえば、次のタイムスタンプは、アメリカ / ロサンゼルス タイムゾーンを使用して 2014 年 9 月 27 日の午後 12 時 30 分を表しています。

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 の実装によって設定されているデフォルトのタイムゾーンが使用されます。

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

例:

SELECT * FROM Roster WHERE LastName = @myparam

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

コメント

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

単一行コメント

1 行全体をコメントにするには、単一行コメントを使用します。

# this is a single-line comment
SELECT book FROM library;
-- this is a single-line comment
SELECT book FROM library;
/* this is a single-line comment */
SELECT book FROM library;
SELECT book FROM library
/* this is a single-line comment */
WHERE book = "Ulysses";

インライン コメント

ステートメントと同じ行にコメントを入れる場合は、インライン コメントを使用します。# または -- で始まるコメントは、ステートメントの右側に表示される必要があります。

SELECT book FROM library; # this is an inline comment
SELECT book FROM library; -- this is an inline comment
SELECT book FROM library; /* this is an inline comment */
SELECT book FROM library /* this is an inline comment */ WHERE book = "Ulysses";

複数行のコメント

複数行にわたるコメントを作成する場合は、複数行コメントを使用します。複数行コメントをネストすることはできません。

SELECT book FROM library
/*
  This is a multiline comment
  on multiple lines
*/
WHERE book = "Ulysses";
SELECT book FROM library
/* this is a multiline comment
on two lines */
WHERE book = "Ulysses";
このページは役立ちましたか?評価をお願いいたします。

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

Cloud Spanner のドキュメント