词法结构
编辑词法结构
编辑本节介绍 SQL 的主要词法结构,在大多数情况下,它与 ANSI SQL 本身非常相似,因此不会深入讨论底层细节。
Elasticsearch SQL 当前一次只接受一个命令。命令是由输入流末尾终止的一系列标记。
标记可以是关键字、标识符(带引号或不带引号)、字面量(或常量)或特殊字符符号(通常是分隔符)。标记通常由空格(空格或制表符)分隔,但在某些情况下,如果不存在歧义(通常由于字符符号),则不需要空格——但是为了可读性,应避免这种情况。
关键字
编辑以下是一个示例
SELECT * FROM table
此查询包含四个标记:SELECT
、*
、FROM
和 table
。前三个,即 SELECT
、*
和 FROM
是关键字,这意味着它们在 SQL 中具有固定含义的单词。table
标记是一个标识符,这意味着它(通过名称)标识 SQL 中的实体,例如表(在本例中)、列等。
可以看出,关键字和标识符具有相同的词法结构,因此如果不了解 SQL 语言,就无法知道某个标记是哪个。完整的关键字列表可在保留关键字附录中找到。请注意,关键字不区分大小写,这意味着前面的示例可以写成
select * fRoM table;
但是标识符区分大小写——由于 Elasticsearch 区分大小写,Elasticsearch SQL 会逐字使用接收到的值。
为了帮助区分两者,在整个文档中,SQL 关键字都使用大写字母,我们认为这种约定可以提高可读性,因此也推荐给其他人。
标识符
编辑标识符可以分为两种类型:带引号和不带引号
SELECT ip_address FROM "hosts-*"
此查询包含两个标识符,ip_address
和 hosts-*
(一个索引模式)。由于 ip_address
与任何关键字都不冲突,因此可以直接使用;另一方面,hosts-*
由于与 -
(减法运算)和 *
冲突,因此需要使用双引号。
另一个示例
SELECT "from" FROM "<logstash-{now/d}>"
第一个标识符 `from` 需要加引号,否则它会与 `FROM` 关键字冲突(不区分大小写,因此可以写成 `from`),而第二个标识符使用 Elasticsearch 的索引和索引别名名称中的日期数学支持,否则会使解析器混淆。
因此,总的来说,尤其是在处理用户输入时,强烈建议对标识符使用引号。它只会略微增加查询的长度,但却能提高清晰度和消除歧义。
字面量(常量)
编辑Elasticsearch SQL 支持两种隐式类型的字面量:字符串和数字。
字符串字面量
编辑字符串字面量是由单引号 '
括起来任意数量的字符:'Giant Robot'
。要在字符串中包含单引号,请使用另一个单引号对其进行转义:'Captain EO''s Voyage'
。
转义的单引号不是双引号 ("
),而是重复的单引号 '
(''
)。
数字字面量
编辑数字字面量以十进制和科学计数法(带指数标记 e
或 E
)接受,以数字或小数点 .
开头。
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
)。
通用字面量
编辑处理任意类型字面量时,通常通过将字符串表示形式强制转换为所需类型来创建对象。这可以通过专用的强制转换运算符和函数来实现。
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 中,单引号 '
和双引号 "
的含义不同,不能互换使用。单引号用于声明字符串字面量,而双引号用于标识符。
例如:
要转义单引号或双引号,需要再次使用该特定引号。例如,字面量 John's
可以像这样转义:SELECT 'John''s' AS name
。双引号转义也是如此——SELECT 123 AS "test""number"
将显示一个名为 test"number
的列作为结果。
特殊字符
编辑一些非字母数字字符具有与运算符不同的专用含义。为完整起见,这些字符如下所示:
字符 |
描述 |
|
星号(或通配符)在某些上下文中用于表示表的全部字段。也可以用作某些聚合函数的参数。 |
|
逗号用于枚举列表的元素。 |
|
用于数字常量或分隔标识符限定符(目录、表、列名称等)。 |
|
圆括号用于特定的 SQL 命令、函数声明或强制优先级。 |
运算符
编辑Elasticsearch SQL 中的大多数运算符具有相同的优先级,并且是左结合的。由于这是在解析时完成的,因此需要使用括号来强制不同的优先级。
下表显示了支持的运算符及其优先级(从高到低);
运算符/元素 |
结合性 |
描述 |
|
左 |
限定符分隔符 |
|
左 |
PostgreSQL 风格的类型强制转换 |
|
右 |
一元加号和减号(数字字面量符号) |
|
左 |
乘法、除法、模运算 |
|
左 |
加法、减法 |
|
范围包含、字符串匹配 |
|
|
比较 |
|
|
右 |
逻辑非 |
|
左 |
逻辑与 |
|
左 |
逻辑或 |
注释
编辑Elasticsearch SQL 允许使用注释,注释是被解析器忽略的字符序列。
支持两种样式
- 单行
- 注释以双破折号
--
开头,一直持续到行尾。 - 多行
- 以
/*
开头并以*/
结尾的注释(也称为 C 风格)。
-- single line comment /* multi line comment that supports /* nested comments */ */