Spec-Zone.ru › Elasticsearch 7
›Руководство по Elasticsearch [7.17] ›SQL ›Язык SQL

Лексическая структура

В данном разделе рассматривается основная лексическая структура 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), а второй идентификатор с использованием 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 (или BIGINT в типах ANSI 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 одинарные кавычки ' и двойные кавычки " имеют разное значение и не могут использоваться взаимозаменяемо. Одинарные кавычки используются для объявления строкового литерала строкового литерала, а двойные кавычки — для идентификаторов.

Например:

SELECT "first_name" 
  FROM "musicians"  
 WHERE "last_name"  
     = 'Carroll'    

Двойные кавычки " используются для идентификаторов столбцов и таблиц

Одинарные кавычки ' используются для строкового литерала

Для экранирования одинарных или двойных кавычек необходимо использовать ту же самую кавычку ещё раз. Например, литерал 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 позволяет использовать комментарии, которые представляют собой последовательность символов, игнорируемых анализаторами.

Поддерживаются два стиля:

Одна строка
Комментарии начинаются с двух дефисов -- и продолжаются до конца строки.
Несколько строк
Комментарии, которые начинаются с /* и заканчиваются */ (также известный как стиль C).
-- single line comment
/* multi
   line
   comment
   that supports /* nested comments */
   */

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/sql-lexical-structure.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API