語彙の構造と構文

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

Google 標準 SQL ステートメントは、一連のトークンで構成されます。トークンには識別子、引用符付き識別子、リテラル、キーワード、演算子、特殊文字があります。トークンはスペース、バックスペース、タブ、改行などのコメントや空白文字で区切ることができます。

識別子

識別子は、列、テーブル、パス式などに関連付けられる名前です。引用符で囲んでも囲まなくてもかまいません。また、一部では大文字と小文字が区別されます。

引用符で囲まれていない識別子

  • 識別子は文字またはアンダースコア(_)文字で始める必要があります。
  • 後続の文字には、文字、数字、アンダースコア(_)、ダッシュを使用できますが、ダッシュには追加のルールが適用されます(次のルールをご覧ください)。
  • 単独のダッシュは、引用符で囲まれていないほとんどの識別子で使用できますが、先頭または末尾では使用できません。

    引用符で囲まれていない識別子にダッシュを使用する場合、基本的には引用符で囲まれていない識別子と 1 つ以上の引用符で囲まれていない識別子とを組み合わせます。ダッシュを使用する場合は、通常、次の構造に従う必要があります。

    unquoted_identifier[-{ unquoted_identifier | number }][...]
    

    例: foo-barfoo-22foo-22-bar

    ダッシュはフィールド名では使用できません。

引用符で囲まれている識別子

  • バッククォート(`)文字で囲む必要があります。
  • スペースや記号など、あらゆる文字を含めることができます。
  • 空白にはできません。
  • エスケープ シーケンスは文字列リテラルと同じです。
  • ID が予約済みキーワードと同じ場合は、引用符で囲む必要があります。たとえば、識別子 FROM は引用符で囲む必要があります。パス式には追加のルールが適用されます。

識別子の例

パス式の例:

-- Valid. _5abc and dataField are valid identifiers.
_5abc.dataField

-- Valid. `5abc` and dataField are valid identifiers.
`5abc`.dataField

-- Invalid. 5abc is an invalid identifier because it is unquoted and starts
-- with a number rather than a letter or underscore.
5abc.dataField

-- Valid. abc5 and dataField are valid identifiers.
abc5.dataField

-- Invalid. abc5! is an invalid identifier because it is unquoted and contains
-- a character that is not a letter, number, or underscore.
abc5!.dataField

-- Valid. `GROUP` and dataField are valid identifiers.
`GROUP`.dataField

-- Invalid. GROUP is an invalid identifier because it is unquoted and is a
-- stand-alone reserved keyword.
GROUP.dataField

-- Valid. abc5 and GROUP are valid identifiers.
abc5.GROUP

関数の例:

-- Valid. dataField is a valid identifier in a function called foo().
foo().dataField

配列アクセス オペレーションの例:

-- Valid. dataField is a valid identifier in an array called items.
items[OFFSET(3)].dataField

名前付きクエリ パラメータの例:

-- Valid. param and dataField are valid identifiers.
@param.dataField

テーブル名の例:

-- Valid table path.
myproject.mydatabase.mytable287
-- Valid table path.
myproject287.mydatabase.mytable
-- Invalid table path. The project name starts with a number and is unquoted.
287myproject.mydatabase.mytable
-- Invalid table name. The table name is unquoted and is not a valid
-- dashed identifier, as the part after the dash is neither a number nor
-- an identifier starting with a letter or an underscore.
mytable-287a
-- Valid table path.
my-project.mydataset.mytable
-- Valid table name.
my-table
-- Invalid table path because the dash is not in the first part
-- of the path.
myproject.mydataset.my-table
-- Invalid table path because a dataset name cannot contain dashes.
my-dataset.mytable

パス式

パス式は、オブジェクトのグラフ内のオブジェクトに移動する方法を記述し、通常は次の構造に従います。

path:
  [path_expression][. ...]

path_expression:
  [first_part]/subsequent_part[ { / | : | - } subsequent_part ][...]

first_part:
  { unquoted_identifier | quoted_identifier }

subsequent_part:
  { unquoted_identifier | quoted_identifier | number }
  • path: 複数のオブジェクトのグラフ。
  • path_expression: 複数のオブジェクトのグラフ内のオブジェクト。
  • first_part: パス式は引用で囲まれている識別子または引用符で囲まれていない識別子で開始できます。パス式が予約済みキーワードで開始されている場合、引用符で囲まれている識別子である必要があります。
  • subsequent_part: パス式の後続部分には、予約済みキーワードなどの非識別子を含めることができます。パス式の後続部分が予約済みキーワードで始まっている場合は、引用符で囲んでも囲まなくてもかまいません。

例:

foo.bar
foo.bar/25
foo/bar:25
foo/bar/25-31
/foo/bar
/25/foo/bar

テーブル名

テーブル名はテーブルの名前を表します。

テーブル名は、引用符で囲まれている識別子または引用符で囲まれていない識別子です。引用符で囲まれていない場合:

  • 引用符で囲まれていない識別子では、FROM 句または TABLE 句で参照される場合にダッシュを使用できます。 テーブルパスの最初の識別子(プロジェクト ID またはテーブル名)でのみ、ダッシュを使用できます。ダッシュはデータセットでは使用できません。

テーブル名は、最大 3 つの引用符に囲まれている識別子または引用符に囲まれていない識別子を含む完全修飾されたテーブル名(テーブルパス)にできます。

例: myproject.mydataset.mytable

テーブル名はパス式にできます。

例:

my-project.mydataset.mytable
mydataset.mytable
my-table
mytable
`287mytable`

列名

列名は、テーブルの列の名前を表します。

  • 列名は、引用符で囲まれている識別子または引用符で囲まれていない識別子です。
  • 引用符で囲まれていない識別子では、FROM 句または TABLE 句で参照されている場合、ダッシュ使用した識別子を使用できます。
  • 列名には追加のルールがあります。

例:

columnA
column-a
`287column`

リテラル

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

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

文字列リテラルとバイトリテラルはどちらも引用符で囲む必要があります。単一引用符(')または二重引用符(")を使用するか、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 として解釈されます。

整数リテラルは、整数データ型の定数値を表します。

数値リテラル

NUMERIC キーワードの後に、引用符で囲まれた浮動小数点値を続けることで、NUMERIC リテラルを作成できます。

例:

SELECT NUMERIC '0';
SELECT NUMERIC '123456';
SELECT NUMERIC '-3.14';
SELECT NUMERIC '-0.54321';
SELECT NUMERIC '1.23456e05';
SELECT NUMERIC '-9.876e-3';

NUMERIC リテラルは NUMERIC データ型の定数値を表します。

BIGNUMERIC リテラル

BIGNUMERIC キーワードの後に、引用符で囲まれた浮動小数点値を続けることで、BIGNUMERIC リテラルを作成できます。

例:

SELECT BIGNUMERIC '0';
SELECT BIGNUMERIC '123456';
SELECT BIGNUMERIC '-3.14';
SELECT BIGNUMERIC '-0.54321';
SELECT BIGNUMERIC '1.23456e05';
SELECT BIGNUMERIC '-9.876e-3';

BIGNUMERIC リテラルは BIGNUMERIC データ型の定数値を表します。

浮動小数点リテラル

構文オプション:

[+-]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>[]

配列リテラルは配列データ型の定数値を表します。

構造体リテラル

構造体リテラルは、フィールドがすべてリテラルの構造体です。構造体リテラルは、構造体の作成構文(タプル構文、型なしの構造体構文、型のある構造体構文)のいずれかを使用して記述できます。

タプル構文は、通常のかっこで囲まれた式と区別するために、少なくとも 2 つのフィールドが必要です。単一のフィールドで構造体リテラルを書き込むには、型なしの構造体構文または型のある構造体構文を使用します。

出力データ型
(1, 2, 3) STRUCT<INT64, INT64, INT64>
(1, 'abc') STRUCT<INT64, STRING>
STRUCT(1 AS foo, 'abc' AS bar) STRUCT<foo INT64, bar STRING>
STRUCT<INT32, INT64>(1, 2) STRUCT<INT32, INT64>
STRUCT(1) STRUCT<INT64>
STRUCT<INT64>(1) STRUCT<INT64>

構造体リテラルは、構造体データ型の定数値を表します。

日付リテラル

構文:

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" は日付リテラルに強制変換されます。

日付リテラルは、日付データ型の定数値を表します。

時間リテラル

構文:

TIME '[H]H:[M]M:[S]S[.DDDDDD]'

時間リテラルには、TIME キーワードと、正規の時刻形式に従う単一引用符で囲まれた文字列リテラルが含まれます。

たとえば、次の時刻は午後 12 時 30 分を表しています。

TIME '12:30:00.45'

時間リテラルは、時間データ型の定数値を表します。

DATETIME リテラル

構文:

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

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

たとえば、次の DATETIME は 2014 年 9 月 27 日の午後 12 時 30 分を表します。

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

DATETIME リテラルでは 1~9999 の範囲の年数がサポートされます。この範囲外となる DATETIME の値は無効です。

正規の DATETIME 形式に従う文字列リテラルは、DATETIME 式が予期される場所で使用すると、暗黙的に DATETIME リテラルに強制変換されます。

例:

SELECT * FROM foo
WHERE datetime_col = "2014-09-27 12:30:00.45"

上記のクエリでは、文字列リテラル "2014-09-27 12:30:00.45" は DATETIME リテラルに強制変換されます。

DATETIME リテラルには、オプションの文字 Tt を含めることもできます。これは時刻のフラグで、日付と時刻の区切り文字として使用されます。この文字を使用する場合、前後にスペースを含めることはできません。以下は有効です。

DATETIME '2014-09-27T12:30:00.45'
DATETIME '2014-09-27t12:30:00.45'

日時リテラルは、日時データ型の定数値を表します。

タイムスタンプ リテラル

構文:

TIMESTAMP 'YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.F]] [time_zone]'
TIMESTAMP 'YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.F]][time_zone_offset]'

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

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

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

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

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

たとえば、次のタイムスタンプは、デフォルトのタイムゾーン(UTC)で 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"

タイムスタンプ リテラルには、次のオプションの文字を含めることができます。

  • T または t: 時間のフラグ。日付と時刻の区切り文字として使用します。
  • Z または z: デフォルトのタイムゾーンのフラグ。これは [timezone] と一緒には使用できません。

これらの文字のいずれかを使用する場合、その前後にスペースを含めることはできません。以下は有効です。

TIMESTAMP '2017-01-18T12:34:56.123456Z'
TIMESTAMP '2017-01-18t12:34:56.123456'
TIMESTAMP '2017-01-18 12:34:56.123456z'
TIMESTAMP '2017-01-18 12:34:56.123456Z'

タイムスタンプ リテラルは、タイムスタンプ データ型の定数値を表します。

タイムゾーン

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

Google 標準 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 などになります。

例:

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

間隔リテラル

構文:

INTERVAL 'N' datetime_part
INTERVAL '[Y]-[M] [D] [H]:[M]:[S].[F]' datetime_part TO datetime_part

datetime_part は、YEARMONTHDAYHOURMINUTE、または SECOND のいずれかです。

間隔リテラルには 2 つの形式があります。最初の形式は、単一の日時部分で構成されています。例:

INTERVAL '5' DAY
INTERVAL '0.001' SECOND

2 番目の形式を使用すると、複数の日時部分を連続して指定できます。例:

-- 10 hours, 20 minutes, 30 seconds
INTERVAL '10:20:30' HOUR TO SECOND
-- 1 year, 2 months
INTERVAL '1-2' YEAR TO MONTH
-- 1 month, 15 days
INTERVAL '1 15' MONTH TO DAY
-- 1 day, 5 hours, 30 minutes
INTERVAL '1 5:30' DAY TO MINUTE

間隔リテラルは、間隔データ型の定数値を表します。

JSON リテラル

構文:

JSON 'json_formatted_data'

JSON リテラルは、JSON 形式のデータを表します。

例:

JSON '
{
  "id": 10,
  "type": "fruit",
  "name": "apple",
  "on_menu": true,
  "recipes":
    {
      "salads":
      [
        { "id": 2001, "type": "Walnut Apple Salad" },
        { "id": 2002, "type": "Apple Spinach Salad" }
      ],
      "desserts":
      [
        { "id": 3001, "type": "Apple Pie" },
        { "id": 3002, "type": "Apple Scones" },
        { "id": 3003, "type": "Apple Crumble" }
      ]
    }
}
'

JSON リテラルは、JSON データ型の定数値を表します。

大文字と小文字の区別

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

Category 大文字と小文字の区別の有無 メモ
キーワード ×  
組み込み関数名 ×  
ユーザー定義の関数名  
テーブル名 メモを参照 is_case_insensitive オプションを TRUE に設定しない限り、データセット名とテーブル名では大文字と小文字が区別されます。
Column names ×  
文字列の値
文字列の比較  
クエリ内のエイリアス ×  
正規表現一致 メモを参照 式自体で大文字と小文字を区別しないように指定した場合を除き、正規表現のマッチングのデフォルトでは、大文字と小文字が区別されます。
LIKE 一致  

予約済みのキーワード

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

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

Google 標準 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
QUALIFY
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)を介してクエリ文字列ステートメントを送信する場合、終了セミコロン(;)をオプションとして使用できます。

複数のステートメントを含むリクエストでは、各ステートメントをセミコロンで区切る必要がありますが、最終ステートメントでのセミコロンはオプションになります。対話型ツールによっては、ステートメントに終了セミコロンを使用する必要があります。

末尾のカンマ

SELECT ステートメントの列リストの末尾に、末尾のカンマ(,)をオプションとして使用できます。列リストをプログラムで作成した場合、その結果として末尾にカンマが含まれることもあります。

SELECT name, release_date, FROM Books

クエリ パラメータ

クエリ パラメータを使用して、任意の式を置換できます。ただし、クエリ パラメータを識別子、列名、テーブル名、またはクエリ自体の他の部分の代わりとして使用することはできません。クエリ パラメータはクエリ ステートメントの外部で定義されます。

クライアント API を使用すると、パラメータ名と値をバインドできます。クエリエンジンは、実行時にパラメータのバインド値を置き換えます。

CREATE FUNCTIONCREATE VIEWCREATE MATERIALIZED VIEWCREATE PROCEDURE ステートメントの SQL 本文でクエリ パラメータを使用することはできません。

名前付きクエリ パラメータ

構文:

@parameter_name

名前付きクエリ パラメータは、識別子の先頭に @ 文字が付いています。名前付きクエリ パラメータを位置クエリ パラメータと併用することはできません。

名前付きクエリ パラメータは、識別子または予約済みキーワードで開始できます。識別子は引用符で囲んでも囲まなくてもかまいません。

例:

この例では、LastName が名前付きクエリ パラメータ myparam の値と等しいすべての行が返されます。

SELECT * FROM Roster WHERE LastName = @myparam

位置クエリ パラメータ

位置クエリ パラメータは、? 文字を使用して表示されます。位置パラメータは、渡された順序で評価されます。位置クエリ パラメータは、名前付きクエリ パラメータと併用できません。

例:

このクエリは、LastNameFirstName がこのクエリに渡された値と等しいすべての行を返します。これらの値が渡される順序が重要です。姓が最初に渡され、その後に名が渡された場合、期待される結果は返されません。

SELECT * FROM Roster WHERE FirstName = ? and LastName = ?

コメント

コメントはパーサーによって無視される文字シーケンスです。Google 標準 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";