Выражения в SQL запросах, поддерживаемые в QDB
expr binary-op expr |expr [NOT] { LIKE | GLOB } expr [ESCAPE expr] |unary-op expr |( expr ) |[[database-name .] [table-name .] column-name |literal-value |parameter |function-name ( expr-list | * ) |expr ISNULL |expr NOTNULL |expr [NOT] BETWEEN expr AND expr |expr [NOT] IN ( value-list ) |expr [NOT] IN ( select-statement ) |expr [NOT] IN [database-name .] table-name |[EXISTS] ( select-statement ) |CASE [expr] ( WHEN expr THEN expr )+ [ELSE expr] END |CAST ( expr AS type )expr COLLATE collation-name
Выражения SQL представляют собой подкомпоненты команд. QDB поддерживает следующие бинарные операторы (в порядке приоритета):
||* / %+ -<< >> & |< <= > >== == != <> INANDOR
QDB поддерживает следующие унарные префиксные операторы:
- + ! ~ NOT
Оператор COLLATE можно рассматривать как унарный постфиксный оператор. Оператор COLLATE имеет наибольший приоритет — выше, чем любой префиксный унарный оператор или бинарный оператор.
Унарный оператор "+" не выполняет никаких действий. Он применяется к строкам, числам, объектам BLOB
и возвращает значение своего операнда.
Обратите внимание, что существуют два варианта операторов равенства ("=" и "==") и неравенства ("!=" и "<>"). Оператор "||" выполняет «конкатенацию» — объединяет две строки, которые являются его операндами. Результатом оператора "%" является остаток левого операнда по модулю правого операнда.
Результатом любого бинарного оператора является число, за исключением оператора конкатенации "||", который возвращает строку.
Литеральное значение — это целое или вещественное число. QDB поддерживает экспоненциальный формат. Символ "." используется в качестве десятичной точки, даже если в настройках локали указана запятая (использование запятой в качестве десятичного знака приводит к синтаксической неоднозначности). Строковая константа образуется путем заключения строки в одиночные кавычки ("'"). Чтобы включить одиночную кавычку в состав самой строки, необходимо указать ее дважды, как в языке Паскаль. Управляющие последовательности в стиле языка C с символом обратной косой черты не поддерживаются, поскольку не предусмотрены в стандарте SQL. Литералы BLOB представляют собой строки, которые содержат шестнадцатеричные данные и начинаются с символа "x" или "X":
X'53514697465'
Литеральное значение также может быть равно NULL
.
Параметр — это компонент выражения, в котором хранится литеральное значение, определяемое на этапе выполнения программы с помощью функции qdb_stmt_exec(). Параметры задаются в нескольких форматах:
1
до 999
. Параметры, которым не присвоены значения с помощью функции qdb_stmt_exec(), считаются равными NULL
.
Оператор LIKE operator выполняет сравнение с шаблоном. Его правый операнд содержит шаблон, а левый операнд — строку, которая сравнивается с ним.
Символ процента ("%") в шаблоне соответствует любой последовательности любого (в том числе нулевого) количества символов в строке. Подчеркивание ("_") соответствует одному символу. Все остальные символы сравниваются друг с другом без учета регистра (буквы в верхнем и нижнем регистрах считаются одинаковыми). QDB ошибочно различает только верхний/нижний регистр 7-разрядных символов латинского алфавита, поэтому оператор LIKE чувствителен к регистру 8-разрядных символов в кодировках iso8859 и UTF-8. Например, выражение "'a' LIKE 'A'" равно TRUE, но выражение "'æ' LIKE 'Æ'" равно FALSE.
При наличии дополнительного условия ESCAPE значение последующего выражения должно являться строкой, которая содержит один символ. Этот символ можно использовать для указания литеральных символов подчеркивания и процента в шаблоне LIKE. Управляющий символ, за которым следует процент, подчеркивание или сам управляющий символ, включает в строку второй литерал. Инфиксный оператор LIKE реализуется посредством вызова пользовательской функции like( X,Y ).
Оператор GLOB аналогичен LIKE, но в его шаблонах используется синтаксис подстановки имен файлов, поддерживаемый UNIX. Кроме того, оператор GLOB, в отличие от LIKE, чувствителен к регистру. Для изменения результата проверки на противоположный перед операторами GLOB и LIKE можно указывать ключевое слово NOT. Инфиксный оператор GLOB реализуется посредством вызова пользовательской функции glob( X, Y ) можно изменять его, переопределяя эту функцию.
В качестве имени столбца может использоваться любое имя, которое указано в операторе CREATE TABLE, а также специальные идентификаторы "ROWID", "OID" или "_ROWID_". Эти специальные идентификаторы описывают уникальный случайный целочисленный ключ (ключ строки), который назначается каждой строке каждой таблицы, но этот ключ используется только при условии, что в операторе CREATE TABLE не определен столбец с таким же именем. Работа с ключами строк выполняется так же, как со столбцами, доступными только для чтения. Можно использовать ключ строки в любом месте обычного столбца, но нельзя изменять его значение в операторе UPDATE или INSERT. Следует иметь в виду, что команда SELECT * ... не возвращает ключ строки.
Операторы SELECT могут входить в состав выражений SQL в качестве правого операнда оператора IN, скалярной величины или операнда оператора EXISTS. Если оператор SELECT является скалярной величиной или правым операндом оператора IN, его результат должен содержать единственный столбец. Можно использовать составные операторы SELECT, которые соединены друг с другом ключевыми словами UNION или EXCEPT. В операторе EXISTS столбцы множества результатов SELECT игнорируются, а выражение имеет значение TRUE, если множество результатов содержит как минимум одну строку, и FALSE, если оно является пустым. Если переменные внешнего запроса не используются ни в одном условии выражения SELECT, оно вычисляется один раз перед дальнейшей обработкой, и его результат используется повторно при необходимости. Если выражение SELECT содержит переменные внешнего запроса, оно вычисляется заново при каждом использовании.
Если выражение SELECT является правым операндом оператора IN, и результат его левого операнда совпадает с любым из значений, возвращаемых оператором SELECT, оператор IN возвращает значение TRUE. Для изменения результата проверки на противоположный можно указывать ключевое слово NOT перед оператором IN.
Если выражение SELECT входит в состав выражения, но не является правым операндом оператора IN, первая строка результата используется в качестве значения при вычислении выражения. Если результат SELECT состоит из нескольких строк, все строки, кроме первой, игнорируются. Если результат не содержит ни одной строки, значение SELECT равно NULL
.
Функция CAST приводит выражение к указанному типу данных. В качестве типа можно указывать любое непустое имя, которое является типом столбца, заданным в операторе CREATE TABLE.
QDB поддерживает простые и агрегирующие функции. Простые функции используются в любых выражениях и немедленно возвращают результат, который соответствует их аргументам. Агрегирующие функции можно использовать только в операторах SELECT. Они вычисляют значение для всех строк множества результатов.
По умолчанию доступны следующие основные функции:
NULL
, или NULL
, если все аргументы равны NULL
. Эта функция вызывается как минимум с двумя аргументами. BLOB
. Результатом является шестнадцатеричное представление содержимого этого объекта. NULL
, или значение NULL
, если оба аргумента равны NULL
. Эта функция работает так же, как описанная выше функция coalesce(). NULL
в противном случае. BLOB
представляются в виде шестнадцатеричных литералов. Эта функция используется в текущей реализации команды VACUUM и также полезна при создании триггеров для отмены/повторения действий. -2147483648
до +2147483647
. BLOB
размером N байт с псевдослучайным содержимым. Аргумент N должен быть положительным целым числом. BINARY
. 0
. NULL
, возвращается строка "?000".
Если агрегирующая функция принимает единственный аргумент, перед ним можно указывать ключевое слово DISTINCT, которое удаляет из аргумента повторяющиеся значения перед их передачей в функцию. Например, функция count( distinct X ) возвращает количество уникальных значений в столбце, который является результатом вычисления X, а не суммарное количество значений, не равных NULL
, в этом столбце.
NULL
, в группе. Значения строк и объектов BLOB
, которые невозможно преобразовать в числа, считаются равными 0
. Функция avg() всегда возвращает число с плавающей точкой (даже если все аргументы являются целыми числами). NULL
, в группе. Второй формат не принимает аргументов и возвращает суммарное количество строк в группе. NULL
, в группе. Это значение определяется с применением обычного порядка сортировки. NULL
, в группе. Это значение определяется с использованием обычного порядка сортировки. Значение NULL
возвращается только если все значения группы равны NULL
. NULL
, в группе. Если все строки или значения, передаваемые в эти функции, равны NULL
, функция sum() возвращает NULL
, а функция total() — 0.0
. Несмотря на то, что обычно нет смысла присваивать значение NULL
сумме пустого множества строк, функция sum() реализована таким образом в большинстве существующих СУБД (в том числе в QDB) согласно требованиям стандарта SQL. Удобным решением этой проблемы языка SQL является функция total(), которая всегда возвращает число с плавающей точкой. Функция sum() возвращает целое число, если все ее аргументы, отличные от NULL
, являются целыми числами. Если какой-либо аргумент sum() не является целым числом и не равен NULL
, функция sum() возвращает значение с плавающей точкой, которое приблизительно равно фактической сумме ее аргументов. NULL
, и при вычислении происходит переполнение целочисленного значения. Фукция total() не генерирует никаких исключений.
Предыдущий раздел: перейти