語彙構造
このセクションでは、SQLの主要な語彙構造について説明します。これはほとんどの場合、ANSI SQL自体に似ているため、低レベルの詳細については深く議論しません。
Elasticsearch SQLは現在、一度に1つのコマンドのみを受け付けます。コマンドは、入力ストリームの終わりで終了するトークンのシーケンスです。
トークンは、キーワード、識別子(引用または非引用)、リテラル(または定数)、または特殊文字記号(通常は区切り文字)である可能性があります。トークンは通常、空白(スペースやタブ)で区切られますが、曖昧さがない場合(通常は文字記号による)には、これが必要ないこともあります。ただし、可読性のためにはこれを避けるべきです。
キーワード
次の例を見てください:
Sql
SELECT * FROM table
このクエリには4つのトークンがあります:SELECT
、*
、FROM
、およびtable
。最初の3つ、すなわちSELECT
、*
、およびFROM
はキーワードであり、SQLにおいて固定の意味を持つ単語です。トークンtable
は識別子であり、SQL内のエンティティ(この場合はテーブル)、列などを名前で識別します。
ご覧の通り、キーワードと識別子は同じ語彙構造を持っているため、SQL言語を知らなければトークンがどちらであるかを知ることはできません。キーワードの完全なリストは予約された付録で入手できます。キーワードは大文字と小文字を区別しないことに注意してください。つまり、前の例は次のように書くことができます:
Sql
select * fRoM table;
しかし、識別子はそうではありません。Elasticsearchは大文字と小文字を区別するため、Elasticsearch SQLは受け取った値をそのまま使用します。
両者を区別するために、ドキュメント全体でSQLキーワードは大文字で表記されており、これは可読性を高めるための慣習であり、他の人にも推奨します。
識別子
識別子には2つのタイプがあります:引用と非引用:
Sql
SELECT ip_address FROM "hosts-*"
このクエリには2つの識別子、ip_address
とhosts-*
(インデックスパターン)があります。ip_address
はキーワードと衝突しないため、そのまま使用できますが、hosts-*
は-
(マイナス演算)および*
と衝突するため、二重引用符が必要です。
別の例:
Sql
SELECT "from" FROM "<logstash-{now/d}>"
最初の識別子は引用符で囲む必要があります。そうしないと、FROM
キーワード(大文字と小文字を区別しないため、from
として書くことができます)と衝突します。一方、2番目の識別子はElasticsearchのインデックスおよびインデックスエイリアス名における日付数学サポートを使用しているため、パーサーを混乱させることになります。
したがって、一般的に、特にユーザー入力を扱う場合は、識別子に引用符を使用することを強く推奨します。これはクエリに最小限の増加をもたらし、明確さと曖昧さの解消を提供します。
リテラル(定数)
Elasticsearch SQLは、暗黙的に型付けされたリテラルの2種類をサポートしています:文字列と数値。
文字列リテラル
文字列リテラルは、単一引用符'
で囲まれた任意の数の文字です:'Giant Robot'
。文字列に単一引用符を含めるには、別の単一引用符を使用してエスケープします:'Captain EO''s Voyage'
。
エスケープされた単一引用符は二重引用符("
)ではなく、単一引用符'
が繰り返されるものです(''
)。
数値リテラル
数値リテラルは、10進数および指数表記(指数マーカーe
またはE
)の両方で受け入れられ、数字または小数点.
で始まります:
Sql
1969 -- integer notation
3.14 -- decimal notation
.1234 -- decimal notation starting with decimal point
4E5 -- scientific notation (with exponent marker)
1.2e-3 -- scientific notation with decimal point
小数点を含む数値リテラルは常にdouble
型として解釈されます。小数点を含まないものは、適合する場合はinteger
と見なされ、それ以外の場合はlong
型(またはANSI SQL型ではBIGINT
)と見なされます。
一般的なリテラル
任意の型のリテラルを扱う場合、通常、文字列表現を目的の型にキャストすることでオブジェクトを作成します。これは、専用のキャスト演算子および関数を通じて実現できます:
Sql
123::LONG -- cast 123 to a LONG
CAST('1969-05-13T12:34:56' AS TIMESTAMP) -- cast the given string to datetime
CONVERT('10.0.0.1', IP) -- cast '10.0.0.1' to an IP
Elasticsearch SQLは、人気のあるリテラル(E()
など)を返す関数や、特定の文字列のための専用の解析を提供する関数を提供していることに注意してください。
単一引用符と二重引用符
SQLでは、単一引用符'
と二重引用符"
は異なる意味を持ち、互換性がありません。単一引用符はstring literalを宣言するために使用され、二重引用符は識別子に使用されます。
具体的には:
Sql
SELECT "first_name"
FROM "musicians"
WHERE "last_name"
= 'Carroll'
列およびテーブル識別子に使用される二重引用符" |
|
文字列リテラルに使用される単一引用符' |
単一または二重引用符をエスケープするには、その特定の引用符をもう1回使用する必要があります。たとえば、リテラルJohn's
はSELECT 'John''s' AS name
のようにエスケープできます。二重引用符のエスケープも同様で、SELECT 123 AS "test""number"
は結果としてtest"number
という名前の列を表示します。
特殊文字
アルファベット以外のいくつかの文字は、演算子とは異なる特定の意味を持っています。完全性のために、以下に指定します:
文字 | 説明 |
* |
アスタリスク(またはワイルドカード)は、特定の文脈でテーブルのすべてのフィールドを示すために使用されます。また、一部の集約関数への引数としても使用できます。 |
, |
コンマはリストの要素を列挙するために使用されます。 |
. |
数値定数で使用されるか、識別子の修飾子(カタログ、テーブル、列名など)を区切るために使用されます。 |
() |
括弧は特定のSQLコマンド、関数宣言、または優先順位を強制するために使用されます。 |
演算子
Elasticsearch SQLのほとんどの演算子は同じ優先順位を持ち、左結合です。これは解析時に行われるため、異なる優先順位を強制するには括弧を使用する必要があります。
以下の表は、サポートされている演算子とその優先順位(高い順から低い順)を示しています;
演算子/要素 | 結合性 | 説明 |
. |
左 | 修飾子の区切り |
:: |
左 | PostgreSQLスタイルの型キャスト |
+ - |
右 | 単項プラスおよびマイナス(数値リテラルの符号) |
* / % |
左 | 乗算、除算、剰余 |
+ - |
左 | 加算、減算 |
BETWEEN IN LIKE |
範囲包含、文字列一致 | |
< > <= >= = <=> <> != |
比較 | |
NOT |
右 | 論理否定 |
AND |
左 | 論理積 |
OR |
左 | 論理和 |
コメント
Elasticsearch SQLは、パーサーによって無視される文字のシーケンスであるコメントを許可します。
2つのスタイルがサポートされています:
- 単一行
- コメントは二重ダッシュ
--
で始まり、行の終わりまで続きます。 - 複数行
- コメントは
/*
で始まり、*/
で終わります(Cスタイルとも呼ばれます)。
Sql
-- single line comment
/* multi
line
comment
that supports /* nested comments */
*/